jswindow的问题

(function(){
a = 5;
alert(window.a);
var a = 10;
alert(a);
})();

请问为什么会输出undefined, 10

阅读 2.7k
4 个回答

这段代码的最终是这样执行的。

(function(){
    var a;
    a = 5;
    alert(window.a);
    a = 10;
    alert(a);
})();

这样看应该就明白了吧,所以a应该始终只是一个局部变量。


我一开始也觉得a=5那一句应该会让a变成全局变量的,,

变量提升,a始终是局部变量,这里没有构成闭包,和闭包没有任何关系

// 代码相当于
(function(){
    var a;  // 声明局部变量a
    a = 5;
    alert(window.a);  // 全局作用域中没有a, 所以是undefined
    alert(a); // 局部变量被赋值为5, 弹出5
    a = 10;
    alert(a);  // 局部变量被赋值为10了,所以为10
})();
alert(a); // 多加一步, undefined,证明全局作用域确实没有a

如果你想让a成为全局变量,改一下代码

(function(){
a = 5;
alert(window.a);
a = 10; // 去掉var,这样就不会变量提升了
alert(a);
})();

首先这是一个自执行函数,关于自执行函数可以看这: 自执行函数http://blog.csdn.net/limlimli...

然后这里形成了一个闭包.
如果不是在闭包中,a = 5 可以理解为是在 window 对象中的,
在闭包中,这个 a 只作用于这个函数体内, 所以你访问 window.a 是undefined。

在新的 ES6中,引入了let, 关于闭包和作用域,强烈推荐你看看 阮一峰写的es6 入门, let ,const 那一章。

地址在这: http://es6.ruanyifeng.com/#do...

闭包里的变量无法被外部访问。这就是闭包的一个特点。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题