那是因为: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);