for (id = 50; id < 100; id++)
{
if($('#'+id).attr('class') == 'myField')
{
$('#'+id).bind('click', function() { install(id); } );
}
}
不知道为什么 id 无法到达 function() 中的“安装”。我试图将每个按钮(id 从 50 到 100)与单击事件绑定(bind)以触发 install(id) 函数。但变量 id 似乎无法到达安装功能。当我对其进行硬编码时:
for (id = 50; id < 100; id++)
{
if($('#'+id).attr('class') == 'myField')
{
$('#'+id).bind('click', function() { install( 56 ); });
}
}
它有效!请告诉我原因。
最佳答案
您所犯的错误是使用 Javascript 闭包时最常见的错误之一。
顺便说一句,这个错误如此常见,这一事实在我看来就证明了它确实是语言本身的“错误”。
Javascript 支持读写闭包,因此当您在闭包中捕获变量时,捕获的不是变量的当前值,而是变量本身。 这意味着例如在
var arr = [];
for (var i=0; i<10; i++)
arr.push(function(){alert(i);});
数组中的 10 个函数中的每一个都将包含一个闭包,但它们都将引用循环中使用的相同 i
变量,而不是该变量当时具有的值闭包已创建。因此,如果您调用其中任何一个,输出将是相同的(例如,如果您在循环之后立即调用它们,则为 10
)。
幸运的是,解决方法很简单:
var arr = [];
for (var i=0; i<10; i++)
arr.push((function(i) {
return (function(){alert(i);});
})(i));
使用这种“包装”,您将调用一个匿名函数,并且在该函数内,变量i
与循环不同,并且实际上对于每次调用都是不同的变量。在该函数内部,i
只是一个参数,返回的闭包绑定(bind)到该参数。
根据您的情况,解决方案是:
for (id = 50; id < 100; id++)
{
if($('#'+id).attr('class') == 'myField')
{
$('#'+id).bind('click',
(function(id){
return (function() { install(id); });
})(id));
}
}
关于javascript - 为什么我无法在 javascript 中传递值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8182863/