前端知识学习----声明提升

JS是解释执行的脚本语言,在一段JS脚本执行之前,需要先解析代码,解析的时候会先创建一个全局的执行上下文环境,先把代码中即将执行的变量,函数声明提取出来。(内部的函数还没有执行,不会参与进来)变量先暂时赋值为undefined,函数则先声明好即可使用。
以上做完,然后开始正式执行程序。
举个例子:

console.log(a);   //undefined
var a = 100;
fn('zhangsan');
function fn(name){
    age = 20;
    console.log(name,age); //zhangsan,20
    var age;
}
console.log(b); //b is not defined
b = 100;

其中a是undefined,b报错。原因在于JS代码在执行之前,要全局解析,发现var a,直到有a这个变量,并将其存入执行上下文,而b没有用var关键字声明,JS解析器不识别他,因此不会被存入执行上下文。所以在JS代码执行的时候,a存在于执行上下文,只不过没有被赋值,为undefined;而b在执行上下文没有找到,因此报错。
另外函数在执行之前,也会创建一个执行上下文环境,跟全局执行上下文类似,不过函数执行上下文多出this,arguments和函数的参数。

总结一下:

会生成执行上下文的范围:一段script标签,JS文件,一个函数
全局执行上下文: 变量定义,函数声明
函数执行上下文:变量定义,函数声明,this,arguments,函数参数

猜你喜欢

转载自blog.csdn.net/kf_qyl/article/details/81297958