我遇到了
Javascript的一个奇怪的范围问题(见
JSFiddle):
var someGlobal = 3; function someF() { // undefined issue alert(someGlobal); var someGlobal = 5; // displays 5 alert(someGlobal); } function someF2() { // displays 3,why? alert(someGlobal); } someF(); someF2();
为什么Javascript在someF2()中抛出一个未定义的问题?为什么someF2()可以访问someGlobal,而someF()不能访问?如何确保函数中可以访问全局变量?
备注:
在这两种情况下,函数都是通过调用alert(someglobal)来启动的,为什么一个函数抛出一个未定义的问题而另一个没有?
解决方法
someF创建一个名为someGlobal的新(本地作用域)变量(它掩盖全局someGlobal)并为其赋值.它没有触及全局someGlobal(虽然无法访问它,因为在范围内有另一个具有相同名称的变量).
var语句被提升,因此someGlobal被屏蔽了所有someF(不仅仅是在var语句之后).在为其分配值之前,本地someGlobal的值是未定义的.
someF2访问原始(未触动)全局someGlobal.