Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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_Jquery - Fatal编程技术网

javascript将变量传递给函数内部的函数

javascript将变量传递给函数内部的函数,javascript,jquery,Javascript,Jquery,我无法通过以下方式显示“name”的值: for (var name in array) { var hoverIn = function() { alert(name); }; var hoverOut = function() { }; thing.hover(hoverIn, hoverOut); } 我得到的是一个最后一个值为name的警报窗口。显然我做

我无法通过以下方式显示“name”的值:

   for (var name in array) {
        var hoverIn = function() {
                  alert(name);
        };

        var hoverOut = function() {
        };

        thing.hover(hoverIn, hoverOut);

   }
我得到的是一个最后一个值为name的警报窗口。显然我做错了什么,我怀疑这是一个简单的解决办法。有人能帮忙吗


谢谢。

您应该创建结束:

 for (var name in array) {
        var hoverIn = (function() {
              return function() {
                  alert(name);
              };
        }());

        var hoverOut = function() {
        };

        thing.hover(hoverIn, hoverOut);
   }

您应该创建闭包:

 for (var name in array) {
        var hoverIn = (function() {
              return function() {
                  alert(name);
              };
        }());

        var hoverOut = function() {
        };

        thing.hover(hoverIn, hoverOut);
   }

在循环中添加一个变量

var thisName = name;
然后在函数中使用它

alert(thisName);

在循环中添加一个变量

var thisName = name;
然后在函数中使用它

alert(thisName);

这是一个闭包问题,
name
,在该迭代之后是
array
中的最后一个
name
,并且在迭代发生时不会立即执行悬停回调,因此当实际执行悬停函数时,
name
将始终是
array
中的最后一个

您需要使用IEFE(立即执行的函数表达式):

为了避免重复的
(function(){})(
(这确实让人看得很累),您还可以,正如@pimvdb所指出的,将整个主体包装在一个闭包中:

   for (var name in array) {
        (function(name) {
           var hoverIn = function() {
               alert(name);
           }

           var hoverOut = function() {
           }

           thing.hover(hoverIn, hoverOut);
        })(name); // closure of for loop body

   }

这是一个闭包问题,
name
,在该迭代之后是
array
中的最后一个
name
,并且在迭代发生时不会立即执行悬停回调,因此当实际执行悬停函数时,
name
将始终是
array
中的最后一个

您需要使用IEFE(立即执行的函数表达式):

为了避免重复的
(function(){})(
(这确实让人看得很累),您还可以,正如@pimvdb所指出的,将整个主体包装在一个闭包中:

   for (var name in array) {
        (function(name) {
           var hoverIn = function() {
               alert(name);
           }

           var hoverOut = function() {
           }

           thing.hover(hoverIn, hoverOut);
        })(name); // closure of for loop body

   }

处理这个问题有两种方法

首先要知道的是,作用域只发生在函数级别,而不是javascript中的循环中。 如果从外部源在函数中设置变量,但不立即执行,则该变量将在循环过程中更改

您可以通过关闭其他变量来解决此问题:

var names = ["john","paul","george","ringo"];
var store = {};

//this function receives the data as a parameter
//so it will be a safe copy.

function createFunc(name){
     //just return a function that will alert the name.
    return function(){
       alert(name);
    }
}
for (var i in names) {

        var hoverIn = createFunc(names[i]);

        store[names[i]]=hoverIn;

}
store["john"]();
另一种方法是创建一个立即执行的匿名函数 在循环中:

var names = ["john","paul","george","ringo"];
var store = {};

for (var i in names) {
   //the function receives the i as a parameter
   //and executes, so n is a safe copy of i
  (function(n){

    var hoverIn = function(){
        alert(names[n]);
    }

    store[names[n]]=hoverIn;

  })(i);

}
store["john"]();
一切都是与关闭有关的问题。
查看维基百科了解更多信息。

处理这个问题有两种方法

首先要知道的是,作用域只发生在函数级别,而不是javascript中的循环中。 如果从外部源在函数中设置变量,但不立即执行,则该变量将在循环过程中更改

您可以通过关闭其他变量来解决此问题:

var names = ["john","paul","george","ringo"];
var store = {};

//this function receives the data as a parameter
//so it will be a safe copy.

function createFunc(name){
     //just return a function that will alert the name.
    return function(){
       alert(name);
    }
}
for (var i in names) {

        var hoverIn = createFunc(names[i]);

        store[names[i]]=hoverIn;

}
store["john"]();
另一种方法是创建一个立即执行的匿名函数 在循环中:

var names = ["john","paul","george","ringo"];
var store = {};

for (var i in names) {
   //the function receives the i as a parameter
   //and executes, so n is a safe copy of i
  (function(n){

    var hoverIn = function(){
        alert(names[n]);
    }

    store[names[n]]=hoverIn;

  })(i);

}
store["john"]();
一切都是与关闭有关的问题。
查看维基百科了解更多信息。

这并不能解决任何问题:他已经对var名称进行了关闭。闭包关闭变量,而不是值。这就是它不起作用的原因。在这里,
name
仍然指的是
for
循环中的一个,所以它实际上没有改变任何东西。@mennovandeheuvel你不明白闭包的意思=)检查这个小提琴-。然后就会意识到这是错误的@塞吉奥:不,你没有完全理解它。请尝试您的演示中臭名昭著的
setTimeout
示例:。我尊重您的意见,但它根本不起作用。以下是您的解决方案的演示:。它警告
1
两次,而不是
0
1
。这不会解决任何问题:他已经对var名称进行了关闭。闭包关闭变量,而不是值。这就是它不起作用的原因。在这里,
name
仍然指的是
for
循环中的一个,所以它实际上没有改变任何东西。@mennovandeheuvel你不明白闭包的意思=)检查这个小提琴-。然后就会意识到这是错误的@塞吉奥:不,你没有完全理解它。请尝试您的演示中臭名昭著的
setTimeout
示例:。我尊重您的意见,但它根本不起作用。以下是您的解决方案的演示:。它会提醒
1
两次,而不是
0
1
。您不应该将var传递给函数!为什么要创建名称的副本?作为旁注,也可以只为循环体包装整个
。不应该将var传递给函数!为什么要创建名称的副本?作为旁注,您也可以只为
循环体包装整个