请教各位大神一个简单的js问题

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

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?

阅读 3.1k
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的相关知识储备了,如果楼主基础不好的话,建议一步一步慢慢来

这题应该是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);
  };
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题