Local variable impact global variable - Javascript variable scoping
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
variable hoisting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var a ="global"; //version 1 function changeGlobal(){ alert(a); //why is 'a' undefined here? if(a){ var a ="local"; alert(a); } } //version 2 function changeGlobal(){ alert(a); //why is 'a' 'global' here? what diff does 'var a="local"' make? if(a){ //var a ="local"; alert(a); } } changeGlobal(); |
问题是内联的。 帮助我理解变量范围。
在javascript中,变量声明被"提升"到函数的顶部,与您声明它们的位置无关。
因此,在changeGlobal的第一个变体中,当您声明
那是,
1 2 3 4 5 6 7 | function changeGlobal(){ alert(a); //why is 'a' undefined here? if(a){ var a ="local"; alert(a); } } |
相当于
1 2 3 4 5 6 7 8 | function changeGlobal(){ var a; // hoisted here (not assigned a value yet) alert(a); //why is 'a' undefined here? if(a){ a ="local"; // only assigned a value here alert(a); } } |
在版本1中,您声明一个名为
在版本2中,因为没有本地
JavaScript具有词法作用域,其中变量可以从程序/函数中取消引用,其中
或者以外行术语来说,变量的作用域是它们定义的函数,并且所有变量在函数执行期间的任何时候都可用,尽管可能尚未赋值。
结合起来,这就是你所观察到的 - 一个局部变量阴影全局变量。