javascript将变量传递给函数内部的函数
我无法通过以下方式显示“name”的值:javascript将变量传递给函数内部的函数,javascript,jquery,Javascript,Jquery,我无法通过以下方式显示“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() {
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传递给函数!为什么要创建名称的副本?作为旁注,您也可以只为
循环体包装整个。