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

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

参考文献 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值