为什么全局变量在赋值之前调用会报错
参考文献 https://www.cnblogs.com/highshao/p/5442460.html
声明:本文且是作者写给自己看的不公开,如若你看到了,文章里可能会有一些内容会误导你(因为作者还是个小菜鸟)
一、在声明局部变量前,调用局部变量返回undefind
function f() {
alert(a);
var a = 3;
}
f(); //undefind
二、在全局变量赋值前,调用全局变量会报error: a is not defined
function f() {
alert(a);
a = 3;
}
f(); //error: a is not defined
思考:上面两个例子都是在没有赋值之前就调用了变量,为什么局部变量可以通过编译,而全局变量会报错呢?
答:在预编译期,解析器会对所有var 和 fuction 进行声明,因为全局变量没有var,不能声明所以会报错。
注意:JS的解析过程分为两个阶段:预编译期(预处理)与执行期。
预编译期 :JS会对本代码块中的所有var声明的变量和function 声明的函数进行处理,但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。
执行期 :会按照代码块的顺序逐行执行。。
思考题1:
函数内全局赋值一次,var声明一次 函数f()内还是会优先使用自己的变量a
var a = 1;
function f(){
alert(a);
a = 2;
alert(a);
var a = 3;
alert(a);
}
f(); //undefined 2 和 3
alert(a); //1
经典问题 思考题2:
var a, b;
(function() {
alert(a); //undefined
alert(b); //undefined
var a = b = 3; //等价于 var a = 3 ; b = 3; b是全局的
alert(a); //3
alert(b); //3
})();
alert(a); //undefined
alert(b); //3