2012-06-21 148 views
0

可能重复:
Javascript closure inside loops - simple practical exampleJavaScript for循环过多次。

谁能告诉我,为什么 '我' 这个代码打印出来的数字4的值?循环只能到3,但它会在menu_feedback div内打印'i = 4'。

for(i=1; i<=3; i++){ 
    $('#file_button'+i).hover(function(){ 
     $('#menu_feedback').html('i = '+i+'<br/>'); 
    }, function(){ 
     $('#menu_feedback').html(''); 
    }); 
} 

<button type="button" id="file_button1">Door 1</button> 
<button type="button" id="file_button2">Door 2</button> 
<button type="button" id="file_button3">Door 3</button> 

<div id="menu_feedback"></div> 
+4

啊,可能是第二个最问JavaScript的问题....哪里是dupe ... – epascarello

+1

@epascarello什么是第一个? –

+2

@dystroy那将是异步Ajax,它为什么返回undefined。似乎每天有五次被问到。 – epascarello

回答

5

欢迎来到封闭世界。

使用此:

for(i=1; i<=3; i++) { 
    (function(i) { 
     // the code that depends on i 
    })(i); 
} 
3

这是一个经典的JavaScript问题。这是因为hover函数中的变量i与循环中的变量相同。所以,当循环结束时,i是4,所以在函数中是4。

尝试这样:

var hoverFunc = function(i){ 
    return function(){ 
     $('#menu_feedback').html('i = '+i+'<br/>'); 
    }; 
}; 
for(i=1; i<=3; i++){ 
    $('#file_button'+i).hover(hoverFunc(i), function(){ 
     $('#menu_feedback').html(''); 
    }); 
} 

hoverFunc是一个封闭。它返回一个“关闭”值为i的函数。

2

查看JavaScript closure inside loops – simple practical example了解更多关于您面临的问题的信息。

然而,与jQuery的事件处理程序,还有一个其他的方式通过将指数作为事件数据来解决这个问题,:

for(i=1; i<=3; i++){ 
    $('#file_button'+i).mouseenter({index: i}, function(event){ 
     $('#menu_feedback').html('i = '+ event.data.index + '<br/>'); 
    }).mouseleave(function(){ 
     $('#menu_feedback').html(''); 
    }); 
} 
+0

Woah。不知道你可以传递一个对象到这样的jQuery事件。整齐。 –