返回函数的Javascript作用域错误函数

时间:2013-05-01 23:14:30

标签: javascript node.js scope

这是我的功能的简化版本。问题是我在警报中两次都得到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/

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

Fiddle以下答案

您必须更换

  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,因为它在自己的范围内。

答案 2 :(得分: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]();
}