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

Ale*_*oni 2 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();
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以通过将函数的字符串rappresentation推入数组来解决这个问题:

var f = 'myFunction(\''+k+'\');';
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

谢谢,

亚历山德罗.

Fel*_*ing 5

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

var f = (function(value) {
    return function(){myFunction(value);};
}(k));
Run Code Online (Sandbox Code Playgroud)

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

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

// later

var f = getFunction(k);
Run Code Online (Sandbox Code Playgroud)