JS将参数作为变量传递给匿名函数并稍后调用它 - >参数值问题

时间:2011-02-11 09:10:52

标签: javascript closures

我在调用带有作为变量传递的参数的匿名函数时遇到问题。如果我将一个变量作为参数传递给数组后将一个匿名函数保存到数组中,那么我更改变量并调用该函数,它会打印变量的最后一个值,而不是我推动匿名函数时的变量值进入我的阵列。 我在以下示例中简化了我的代码:

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调用它,但我希望使用第一种方法。

有可能吗?

谢谢,

的Alessandro。

1 个答案:

答案 0 :(得分:5)

您必须创建一个新范围,其中捕获当前值k。 JavaScript只有函数范围,因此您可以使用立即函数

执行此操作
var f = (function(value) {
    return function(){myFunction(value);};
}(k));

您可以通过创建生成匿名函数的命名函数来使其更具可读性:

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

// later

var f = getFunction(k);