2015-11-03 87 views
0

为什么按预期这不工作:的Javascript变中范围,内联函数

$(function(){ 
 
    var datas=[[1],[3]]; 
 
    var functions=[]; 
 
    for(var i in datas){ 
 
    \t var data=datas[i]; 
 
    functions.push(function(){ 
 
    \t $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
 
    }); 
 
    } 
 
    for(var i in functions) 
 
    \t functions[i](); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div />

我想到:

data[0]=1, datas[0][0]=1 

data[0]=3, datas[1][0]=3 

有人能帮助我理解怎么回事这里?

非常感谢, 问候帕特里克

--------- -------解决

var data是过去在功能的范围,但它会之后仍然改变。

为此最好的解决方案是bind()

$(function(){ 
 
    var datas=[[1],[3]]; 
 
    var functions=[]; 
 
    for(var i in datas){ 
 
    \t var data=datas[i]; 
 
    functions.push(function(data){ 
 
    \t $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
 
    }.bind(null,data)); 
 
    } 
 
    for(var i in functions) 
 
    \t functions[i](); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div>

+0

有什么问题? –

+0

我期望数据[0] = 1,数据[0] [0] = 1,我得到数据[0] = 3,数据[0] [0] = 1为什么? – pknoe3lh

+1

[JavaScript闭合内循环 - 简单实用示例]可能的重复(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Hacketo

回答

2

这是所有关于范围。尝试改变

var data=datas[i]; 
functions.push(function(){ 
    $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
}); 

(function (data) { 
    functions.push(function(){ 
     $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
    }); 
})(datas[i]); 

data for循环范围值发生了变化。这就是为什么当调用functions时,他们使用最后修改的值data。 这就是为什么我们创造了一个新的范围,其中datafunction以友好的方式生活在一起。

+1

我会优先考虑与重复的国旗提到一个解决方案.bind(),不知何故更干净,但上述应该工作,无论如何,问题是关闭为重复 – mikus