jswindow的问题

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

请问为什么会输出undefined, 10

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

(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

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

  • 在https网站中如何以http协议传输数据
  • 有个html轮换样式的需求,不知道怎么用js实现,求解。
  • 关于"轮播",为什么我的蓝色框不能被消除?
  • angular-ui-router在ie8状态改变后出不来怎么办?
  • 如何使用JavaScript设置手机主页的快捷方式?
  • windows上安装depot_tools出现问题了。。。
  • 关于将chrome插件里的功能代码分离出来
  • 如何调用微信开放平台登录接口
  • jQuery中的ajax对比原生js中的ajax最大的不同与优势是什么?
  • html5 原生时间控件的清除按钮所触发的事件是什么?
  • 冒泡排序问题???