JS全局与局部变量疑问:为何调用变量仍报undefined错误?
问题原因拆解
哈哈,这个问题我之前帮好几个开发者捋清楚过,咱们一步步拆明白:
第一种场景:全局声明var a却弹出undefined
你全局声明var a后,要记住一个关键:变量声明和变量赋值是完全独立的两步。var a只是告诉JS引擎“存在一个全局变量叫a”,但它的初始值默认就是undefined。只有当你主动调用n1()之后,全局的a才会被赋值为0。
如果你的执行顺序是直接调用n2(),而没先调用n1(),那n2访问的就是那个只被声明、从未被赋值的全局a,自然会弹出undefined。正确的执行顺序应该是这样:
var a; function n1() {a=0;} function n2() {alert(a);} // 先调用n1完成赋值,再调用n2读取 n1(); n2(); // 这时候会正常弹出0
第二种场景:n1内部用var a后依然undefined
这里踩了作用域的核心坑:函数内部用var声明的变量,属于这个函数的局部作用域,和全局变量是完全无关的两个变量。你在n1里写var a; a=0;,相当于在n1的“私有空间”里新建了一个变量a并赋值为0,但全局的a还是那个只被声明、没被赋值的变量。所以哪怕你调用了n1(),n2访问的全局a依然是undefined。
如果想让n1修改全局的a,只要去掉n1里的var,直接给全局a赋值就可以了。
内容的提问来源于stack exchange,提问作者hameds1
相关产品推荐
相关产品推荐

