Javascript 函数无法正确接收参数
Javascript function doesn't receive an argument correctly
可能的重复项:
JavaScript 闭包和变量范围
在 for 循环中分配点击处理程序
我有这个脚本:
var MyClass = {
MyArray: new Array(0, 1, 2, 3, 4),
MyFunc1: function() {
var i = 0;
for (i = MyClass.MyArray.length - 1; i>=0; i--) {
var cen = document.getElementById("cen_" + i); // It is an img element
cen.src = "col.png";
cen.className = "cen_act";
cen.onclick = function() { MyClass.MyFunc1(i); };
} else {
cen.src = "no.png";
cen.className = "cen";
cen.onclick = null;
}
}
},
MyFunc2: function(id) {
alert(id);
}
}
我的问题是,在这一行:cen.onclick = function() { MyClass.MyFunc1(i); };
发送到MyFunc2
的参数始终是-1。MyFunc1
函数应创建四个图像,每个图像都有一个 onclick 事件。当您单击每个图像时,MyFunc2 函数应显示相应的 i 值。看起来 i 值没有为创建的每个事件和图像元素"保存",而只是它的"指针"。
谢谢!
你应该熟悉 JavaScript 闭包的概念,才能理解为什么会发生这种情况。如果你是,那么你应该记住,每个实例
function() { MyClass.MyFunc1(i); };
函数闭包包含 i
的值 -1
(因为它是整个循环完成执行后此变量的最终值(。为避免这种情况,您可以使用bind
:
cen.onclick = (function(i) { MyClass.MyFunc1(i); }).bind(null, i);
或者使用具有正确i
值的显式创建的闭包。
这是一个正常情况,并且对闭包有误解,看到这个线程,你可能会得到一些线索,解决这个问题的简单方法是用一个 立即调用的函数表达式包装你的 for 循环体
MyFunc1: function() {
var i = 0;
for (i = MyClass.MyArray.length - 1; i>=0; i--) {
(function(i) {
var cen = document.getElementById("cen_" + i); // An img element
cen.src = "col.png";
cen.className = "cen_act";
cen.onclick = function() { MyClass.MyFunc2(i); };
} else {
cen.src = "no.png";
cen.className = "cen";
cen.onclick = null;
}
}(i));
}
}
您正在捕获一个在循环内发生变化的变量,因此您始终获得 i 的最后一个值。
您可以通过创建闭包轻松解决此问题:
MyFunc1: function() {
var i = 0;
for (i = MyClass.MyArray.length - 1; i>=0; i--) {
(function(i) {
var cen = document.getElementById("cen_" + i); // An img element
cen.src = "col.png";
cen.className = "cen_act";
cen.onclick = function() { MyClass.MyFunc2(i); };
} else {
cen.src = "no.png";
cen.className = "cen";
cen.onclick = null;
}
})(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参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆