javascript变量作用域问题谢谢
怪我咯
怪我咯 2017-04-10 14:51:04
[JavaScript讨论组]

下面的代码如果使用var,最后输出的是9。

var a = [];
for (var i = 0; i < 10; i++) {
  var c = i;
  a[i] = function () {
    console.log(c);
  };
}
a[6](); // 9为什么一直输出是9??

求高手详解,谢谢

var a = [];
for (var i = 0; i < 10; i++) {
  let c = i;
  a[i] = function () {
    console.log(c);
  };
}
a[6](); // 6 //为什么这次是6??
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
黄舟

注意 let 为 ECMAScript 6新增的命令,在部分低版本浏览器不支持;

let 起到的作用就是申明了块范围变量;
这样console.log(c);就输出了 块范围变量 c

使用var方式定义的c 在for循环结束之后,已经变成了9;
而 a[0]-a[9] 方法中的 console.log(c); 这里的c 又指向了全局变量,所以就一直输出9了;

那么问题来了,这不是我想要的,我那个for循环有屁用啊!!
所以我们要让 console.log(c); 指向局部变量,这就要用到闭包了,

a[i] = (function (u) {
    return function(){
        console.log(u);//这里的u就指向了 参数 u
    }
}(c));//这里通过参数的方式将 c 传进去

推荐看下变量对象的概念:变量对象(Variable Object)

迷茫

因为闭包
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = (function (u) {
return function(){
console.log(u);
}
}(c));
}

巴扎黑

闭包的关系,赋值的时候自成作用域.

这样更好理解一点:
var a = [];
for (var i = 0; i < 10; i++) {
(function() {
var c = i;
a[i] = function() {
console.log(c);
};
})();
}

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号