2008-11-21 67 views
3

这是一个非常基本的问题,但...如何在声明时在JavaScript匿名函数中使用变量的值?

我有这样

var arr = Array('blah.jpg','ha.jpg'); 
for (var i=0; i<array.length; i++) 
{ 
    $('div#blah' + i).click(function() { 
      $('img').attr('src', arr[i]); }); 
} 

这部分代码应该在div绑定id="blah0"点击,当所有的图像切换到'blah.jpg'。 同样,单击id ="blah1"的div应该将所有图像更改为'ha.jpg'

但是,匿名函数将不起作用,因为它会在执行时使用'i'的值,即2。这意味着单击任一div将试图将所有图像设置为arr [2] - 一个不存在的元素(有趣的是不会在我的机器上抛出JS错误,但这是另一回事......)。

如何在声明时使用'i'的值创建匿名函数?

作为简单的例子:

for (var i=0; i<10; i++) 
{ 
    $('div#blah'+i).click(function() { 
     alert(i)); }); 
} 

这应该显示 '0',当我点击 'blah0', '1',当我点击 'blah1' 等

但是,默认它将显示'10',无论我点击'blah'。

回答

5

声明,创建一个新的点击处理程序,得到我的电流值作为参数的函数中一个新的变量:

function makeClickHandler(arr, local_i) { 
    return function() { 
     $('img').attr('src', arr[local_i]); 
    }; 
} 

var arr = Array('blah.jpg','ha.jpg'); 
for (var i=0; i<array.length; i++) 
{ 
    $('div#blah' + i).click(makeClickHandler(arr, i)); 
} 

功能的每个实例得到它自己local_i副本,每次都不会改变。

0

在循环中还有1个变量,并在关闭中使用它之后增加它。

 

var j = 0; 
for (var i=0; i<array.length; i++) 
{ 
    $('div#blah' + j).click(function() { 
      $('img').attr('src', arr[i]); }); 

    j++; 
} 
 
+0

问题不是绑定(即'div#blah'+ j),而是数组访问(即arr [i])。在你使用的方法中,根本不会有任何区别 - 点击仍然会调用arr的'i'元素,使用当时的i值(例如array.length)而不是我创建时的值函数 – 2008-11-21 03:57:01

+0

虽然我不太了解闭包,但可以让点击调用单个函数并检查Event.Src(它会给你div1,div2或div3),从中提取id并根据它设置图像源。 – shahkalpesh 2008-11-21 04:13:06

+0

我还没有试过这个。但是新函数(){...}可能吗? – shahkalpesh 2008-11-21 04:14:06

0

我有这样的答案,但迄今为止黑客攻击的一位:

var arr = Array('blah.jpg','ha.jpg'); 
for (var i=0; i<array.length; i++) 
{ 
    eval("$('div#blah' + i).click(function() { $('img').attr('src', arr[" + i + "]); })"); 
} 

另外:

for (var i=0; i<10; i++) 
{ 
    eval("$('div#blah'+i).click(function() { alert(" + i + ")); });"); 
} 
4

在这种特殊情况下,你应该使用一个封闭:

for (var i=0; i<10; i++) 
{ 
    (function(j){ 
     $('div#blah'+j).click(function() { alert(j)); }); 
    })(i);   
} 

(function(){ /* code */ })()表示自我执行功能,这意味着它将使用和评估我immediat的价值在循环中,而不是在点击时。