javascript - 请教各位大神一个简单的js问题
迷茫
迷茫 2017-04-11 12:13:48
[JavaScript讨论组]

小白请教各位大神,下面这段代码:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

a[6]()的输出结果为什么不是6?
a[6]不是等于:

a[6] = function () {
        console.log(6);
      };

这样的话a[6]()输出应为6?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(5)
巴扎黑

这道题靠闭包原理,利用闭包原理可以做到.面试新人经常会考到的题
在<<高级程序设计>>中讲闭包章节时,有提到,楼主可以去翻翻书,这样印象会深刻一些

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = (function(index){
    return function(){console.log(index)}
  })(i)
}
a[6](); // 6

另外2楼,使用let的方法也是ok的,不过那就涉及到了ES6的相关知识储备了,如果楼主基础不好的话,建议一步一步慢慢来

ringa_lee

这题应该是ES6标准入门中的。理解这道题首先要储备

  1. ES5以前没有块级作用域,声明的变量在其最近的执行环境中

  2. 变量查找会沿着作用域链向上查找

分析:

  1. 声明a,并初始化为一个空数组

  2. 声明i,初始化为0,并且开始循环

  3. 循环中声明了10个函数,此时i值为10

  4. 执行函数a[6](),在函数中没有找到i变量,沿作用域链向上查找,找到了i为10

怪我咯

函数只有调用的时候 才会进到函数里面分配内存,最开始只不过都是 函数而已,里面根本没 获取你所想的 顺序数值。而当你调用 后,都早循环了一遍了,变成了10; 这是获取的当然就是10咯;

天蓬老师

恩,这个就是闭包的问题了。闭包里边只能访问到外围变量的最后一个值,因为i是一个指针而不是副本。或者说闭包是在外围函数返回之后才开始执行,而i已经变成10了

怪我咯

作用域闭包,因为for(var i=0;....)i其实是全局的。。
或者你用es6的let解决最简单了,

let a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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