2015-11-03 83 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