【问题标题】:Javascript variabes scope in inline functions内联函数中的 Javascript 变量范围
【发布时间】:2015-11-03 09:42:30
【问题描述】:

为什么这不能按预期工作:

$(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>

【问题讨论】:

标签: javascript variables scope inline-functions


【解决方案1】:

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

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]);

在 for 循环范围内,data 的值已更改。这就是为什么当调用functions 时,它们使用data 的最后修改值。 这就是为什么我们创建了一个新的范围,datafunction 以友好的方式一起生活。

【讨论】:

  • 我更喜欢在重复标志中提到 .bind() 的解决方案,以某种方式更清洁,但无论上述是否可行,无论如何问题都应作为重复项关闭
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2021-12-18
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多