小白请教各位大神,下面这段代码:
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?
小白请教各位大神,下面这段代码:
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?
这题应该是ES6标准入门中的。理解这道题首先要储备
ES5以前没有块级作用域,声明的变量在其最近的执行环境中
变量查找会沿着作用域链向上查找
分析:
声明a,并初始化为一个空数组
声明i,初始化为0,并且开始循环
循环中声明了10个函数,此时i值为10
执行函数a[6](),在函数中没有找到i变量,沿作用域链向上查找,找到了i为10
函数只有调用的时候 才会进到函数里面分配内存,最开始只不过都是 函数而已,里面根本没 获取你所想的 顺序数值。而当你调用 后,都早循环了一遍了,变成了10; 这是获取的当然就是10咯;
作用域闭包,因为for(var i=0;....)i其实是全局的。。
或者你用es6的let解决最简单了,
let a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
这道题靠闭包原理,利用闭包原理可以做到.面试新人经常会考到的题
在<<高级程序设计>>中讲闭包章节时,有提到,楼主可以去翻翻书,这样印象会深刻一些
另外2楼,使用let的方法也是ok的,不过那就涉及到了ES6的相关知识储备了,如果楼主基础不好的话,建议一步一步慢慢来