javascript - 为什么我无法在 javascript 中传递值?

标签 javascript variables

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/

相关文章:

javascript - 对于 JavaScript 数组和对象,我应该使用哪个 for 循环?

javascript - 使用 jquery 添加不适用于 html5 视频播放器的类

wix - WIX:如何动态设置msi输出文件的名称

Java 登录错误,无法解析为变量

variables - Coldfusion - 如何转义变量内部的变量?

javascript - 为什么 Canvas 上下文 drawImage 在 iPhone 上失败

javascript - 使用javascript从字符串html中读取span标签值

javascript - ASP.NET/IIS 将 302 响应重写为 200

php - 需要重新格式化日期变量以匹配 mysql 中的日期函数

c - 只读取 C 文本文件中的固定列宽