理解内部函数能访问外部函数的实际变量而无须复制是很重要的。这个知识点的关键在“能直接访问” + “无须复制”:
使用这段代码测试:
var aa = function() {
var result = []
for( var i = 0; i < 4; i++) {
result.push( function() {
console.log(i);
});
}
return result;
}
var functionList = aa();
for( var j = 0; j < functionList.length; j++){
functionList[j]();
}
第一次循环:闭包内的 i 等于 外部函数的i:
第二次循环之后,两个闭包内的i都变为1了:
因此,毫无疑问,最后的输出结果是4个4:
solution:如下代码将打印0,1,2,3:
function geneator(i) {
return function() {
console.log(i);
};
}
var aa = function() {
var result = []
for( var i = 0; i < 4; i++) {
result.push( geneator(i));
}
return result;
}
var functionList = aa();
for( var j = 0; j < functionList.length; j++){
functionList[j]();
}
第一次循环:
第二次循环:
核心思想就是“避免在循环中创建函数,先在循环之外创建一个辅助函数,让这个辅助函数再返回一个绑定了当前i值的函数”