Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回函数的Javascript作用域错误函数_Javascript_Node.js_Scope - Fatal编程技术网

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

返回函数的Javascript作用域错误函数,javascript,node.js,scope,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

这是我函数的简化版本。问题是我在警报中两次都得到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
这是一个范围问题。问题在于,这组函数中的每个函数共享相同的变量值。在您的例子中,您忘记了用var声明值,因此它是一个全局变量

然而,即使您确实使用了var,您也会遇到同样的问题

诀窍是通过在另一个函数中包装函数的创建来引入一个新的作用域层

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

这是一个范围问题。问题在于,这组函数中的每个函数共享相同的变量值。在您的例子中,您忘记了用var声明值,因此它是一个全局变量

然而,即使您确实使用了var,您也会遇到同样的问题

诀窍是通过在另一个函数中包装函数的创建来引入一个新的作用域层

    bunchOfFunctions[key] = function(valueCopy) {
      return function() {
        alert(valueCopy);
      };
    }(value);
下面的答案 你将不得不更换

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

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

下面的答案 你将不得不更换

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


这是因为value变量不断变化,所以循环完成后,运行的值是2。这段代码所做的是调用一个带值的函数,该函数返回另一个函数。但是,它返回的另一个函数现在具有正确的值,因为它在自己的作用域中。

当包含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]();
}

当包含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]();
}

这个人回答得好!我也喜欢波蒂,但你有一把我喜欢的小提琴!这个人回答得好!我也喜欢波蒂,但你有一把我喜欢的小提琴!