Javascript 内联函数中的变量作用域

Javascript variabes scope in inline functions

为什么这没有按预期工作:

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

<div>

这都是关于范围的。尝试改变

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 以友好的方式一起生活。