1

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

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 http://jsfiddle.net/earlonrails/q4d66/

4

3 回答 3

2

这是一种范围问题。问题是该组中的每个函数共享相同的变量“值”。在您的情况下,您忘记用 声明“值” var,因此它是一个全局变量。

但是,即使您确实使用var了 ,也会遇到同样的问题。

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

    bunchOfFunctions[key] = function(valueCopy) {
      return function() {
        alert(valueCopy);
      };
    }(value);
于 2013-05-01T23:16:59.283 回答
2

以下答案的小提琴

你将不得不更换

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

和:

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

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

于 2013-05-01T23:18:26.233 回答
0

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

避免此问题的解决方案是:

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]();
}
于 2013-05-01T23:25:15.013 回答