为什么全局变量在赋值之前调用会报错

为什么全局变量在赋值之前调用会报错

参考文献 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
原文地址:https://www.cnblogs.com/hyx626/p/9291995.html