2011-02-11 97 views
2

我有一个调用匿名函数并将变量作为参数传递的问题。如果我在将一个匿名函数作为参数传递给一个数组之后将其保存到一个数组中,那么我会更改该变量并调用该函数,它将输出该变量的最后一个值,而不是当前推送匿名函数时该变量的值进入我的阵列。 我简化我的代码在下面的例子:JS将参数作为变量传递给匿名函数,稍后调用它 - >参数值问题

var arr = []; 

function myFunction(index) { 
    alert(index); 
} 

function doPush() { 
    var k = 'hello'; 

    var f = function(){myFunction(k);}; 

    arr.push(f); 

    k = 'goodbye'; 
} 

function invoker(op) { 
    op(); 
} 

function invokePushed() { 
    invoker(arr[0]); 
} 

doPush(); 
invokePushed(); 

那么,invokePushed();警告'再见'而不是'你好'..我的目标是将数个函数存储到数组中,并按顺序调用它们,但这样我的数组中的所有函数都具有相同(最后一个)参数值。

我知道我可以通过推动功能的字符串rappresentation到阵列解决这个问题:

var f = 'myFunction(\''+k+'\');'; 

,并在调用函数eval调用它,但我希望是使用第一种方法。

可能吗?

谢谢,

亚历山德罗。

回答

5

您必须创建一个新的范围,其中捕获当前值k。 JavaScript有唯一的功能范围,所以你可以用立即功能做到这一点:

var f = (function(value) { 
    return function(){myFunction(value);}; 
}(k)); 

你能做出这样更具可读性通过创建一个命名函数生成的匿名函数:

function getFunction(value) { 
    return function(){myFunction(value);}; 
} 

// later 

var f = getFunction(k); 
+0

谢谢很多,这正是我正在寻找的。我只是通过这种方式改变了getFunction的通用性: 函数getFunction(f,value){ \t return function(){f.apply(null,value);}; } 问候,亚历山德罗。 – 2011-02-11 09:51:19

相关问题