那是因為:js編譯器在執行這個y函數的時候,會把把它body里面的聲明變量提前到最前面進行聲明。比如:var x=2; 編譯器先會在body最前面進行var x 聲明。其實上面的代碼等同于下面的這段代碼: 代碼如下: x = 1; alert(x); var y = function() {<BR>var x;//此時x還未賦值,所以為undefined。 alert(x); x = 2; alert(x); } y();
所以也就不難理解x=undefined的了.但是如果把var x = 2;這段代碼給刪掉,在內部它沒有進行var聲明。它會一直沿著作用域向上找,此時的x 就為全局x. 接下來再看一個更有趣的例子。 代碼如下: var a = 1; function b() { a = 10; return; } b(); alert(a); /////////////////////////////////// var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a);