JS闭包和函数参数
JS Closure and Function Parameters
以下片段来自JS和闭包上这个线程的"示例5"。或者,另一条线索也能找到我好奇的地方。
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + i;
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
这个片段来自的线程表示输出为:"item3 undefined"x3。我理解为什么"item3"被打印了三次,但我不理解为什么list[i]
是未定义的。
我的问题:由于list是buildList的一个参数,这是否意味着它不是result.push中匿名函数闭包的一部分?如果buildList(otherList)中有一个变量被设置为list(而匿名函数使用了otherList[i]),那么otherList[i]会在闭包中吗?(因此,输出将不是"item3 undefined"x3,而是"item3 3"x3)。
它有三个元素,所以最大有效索引是2。所以它不是打印item3 undefined
,而是打印item2 undefined
。
原因:
因为您知道该函数每次都打印item-2
字符串,所以该函数绑定到引用,而不是值。(使用即时调用函数可以避免这种情况)。
但当我穿过i < array.length
时,循环停止/停止,因此i的最后更新值现在是3
,索引3处的数组[1,2,3]是undefined
。因此,您看到的是未定义的值。
验证:
添加console.log,如下所示
for (var i = 0; i < list.length; i++) {
var item = 'item' + i;
result.push( function() {
console.log(i); //Prints 3 for all 3 invocation.
alert(item + ' ' + list[i])
} );
}
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆