值由于引用访问而被覆盖
Value gets overwritten because of access by reference
a = [];
for (var i = 0; i < 3; i++) {
a.push(function() {
console.log(i);
})
}
a[0]() // I want 0, but I get 3
我试着写一段简单的代码,我有一个函数数组,这样当我在一个特定的索引处执行一个函数时,索引值应该被打印出来。
但是,上面的代码段对所有索引值显示相同的结果(在本例中为3)。我知道值是通过引用指向的,因此指向I的最后一个值。有人能指出如何以正确的方式做到这一点吗?将其包裹在函数周围。现在每次循环执行时,包装器函数都有自己的值i
。
a = [];
for (var i = 0; i < 3; i++) {
(function(i){
a.push(function() {
console.log(i);
})
})(i);
}
a[0]()
您可以添加一个自执行函数来充当模块。这样做,变量i
的作用域在该函数中。
a = [];
for (var i = 0; i < 3; i++) {
(function(i){
a.push(function() {
alert(i);
})
})(i);
}
a[0]()
注:在此块(function(i){ ... })(i)
, i
可以有任何名称, i
from loop和 i
from function之间没有联系,即(function(r){ ... })(r)
这是一个匿名函数的替代版本,它被一次创建并执行。
你遇到的问题是,当函数被调用时,循环已经被评估,i
的值已经达到3
的最大值。在执行循环时,需要捕获i
的当前值。
var a = [];
for (var i = 0; i < 3; i++) {
var fn = function() {
console.log(arguments.callee.i);
}
fn.i = i; // Pass as 'i' parameter to 'fn'.
a.push(fn);
}
a[0](); // The value 0 will be printed, rather than 3.
剥猫皮的方法不止一种。上面的代码非常类似于:
var a = [];
function fn(i) {
return function() {
console.log(i);
}
}
for (var i = 0; i < 3; i++) {
a.push(fn(i));
}
a[0](); // The value 0 will be printed, rather than 3.
相关文章:
- 访问布局信息是否也会导致浏览器重排
- WebDriver Selenium:Javascript代码覆盖范围,无需服务器访问
- 如何通过javascript访问XUL覆盖层中的元素
- 从不同的.js文件中访问 1 个.js源文件 (jqTree) 中的变量以覆盖方法
- 使用 getter/setter 覆盖 javascript 属性,同时仍访问底层属性
- 覆盖对象访问 JavaScript
- 是否仍可访问被覆盖的函数/方法
- AngularJS指令访问相同的作用域对象——避免覆盖
- 当名称被参数覆盖时访问自身的函数
- 覆盖时的访问控制台功能
- React原生路由器flux:覆盖组件内部的左键或右键,并访问本地功能
- 访问被覆盖的Chrome页面
- 在没有处理程序引用的情况下覆盖侦听器,是否可以访问Ext.data.store上的(可能是私有的)事件属性
- 如何访问XUL覆盖DOM
- 访问函数内被覆盖的全局变量
- 访问窗口.覆盖后的控制台
- 当菜单被访问时,CSS覆盖不能正常工作
- 访问被字段名覆盖的本机表单属性
- 值由于引用访问而被覆盖
- 在javascript中,我可以覆盖括号来访问字符串中的字符吗