JavaScript范围错误函数返回函数

这是我的function的简化版本。 问题是我在警报中都得到两次。 我相信这是一个可变范围的问题,但我似乎无法弄清楚。

var someObj = {"a" : 1, "b" : 2}; function getData(obj){ var bunchOfFunctions = {}; for(var key in obj){ value = obj[key]; bunchOfFunctions[key] = function(){ alert(value); } } return bunchOfFunctions; } var functs = getData(someObj); for(var key in functs){ functs[key](); } 

这里是一个jsfiddle.net/earlonrails/q4d66/

下面的答案的小提琴

你将不得不更换

  value = obj[key]; bunchOfFunctions[key] = function(){ alert(value); } 

附:

  value = obj[key]; bunchOfFunctions[key] = (function(value) { return function() { alert(value); } })(value) 

这是因为valuevariables不断变化,所以一旦循环完成,运行value是2.这段代码做的是调用一个函数的value ,该函数返回另一个函数。 然而,它返回的另一个函数现在具有正确的value因为它在它自己的范围内。

这是一个范围问题。 问题在于每个函数在一堆共享相同的variables“值”。 在你的情况下,你忘了用var声明“value”,所以它是一个全局variables。

即使你使用了var ,你也会遇到同样的问题。

诀窍是通过在另一个函数中包装函数的创build来引入一个新的范围层。

  bunchOfFunctions[key] = function(valueCopy) { return function() { alert(valueCopy); }; }(value); 

当包含alert语句的函数运行时,它只能看到for语句的最后一次交互的值

避免这个问题的解决scheme是:

 var someObj = {"a" : 1, "b" : 2}; function getData(obj){ var bunchOfFunctions = {}; for(var key in obj){ var value = obj[key]; bunchOfFunctions[key] = (function(x){ return function() { alert(x); } })(value) } return bunchOfFunctions; } var functs = getData(someObj); for(var key in functs){ functs[key](); }