JS передает параметры в качестве переменных анонимной функции и вызывает ее позже -> проблема значения параметра - PullRequest
2 голосов
/ 11 февраля 2011

У меня проблема с вызовом анонимной функции с параметрами, передаваемыми как переменные.Если я сохраню анонимную функцию в массив после передачи ей переменной в качестве параметра, то я изменяю переменную и вызываю функцию, она печатает последнее значение переменной, а не значение переменной в тот момент, когда я нажал анонимную функциюв мой массив.Я упрощаю мой код в следующем примере:

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();

Ну, invokePressed ();предупреждение «до свидания» вместо «привет». Моя цель - сохранить в массиве несколько функций и вызвать их последовательно, но таким образом все функции в моем массиве имеют одинаковое (последнее) значение параметров.

Я знаю, что могу решить эту проблему, поместив строку представления функции в массив:

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

и вызвав ее с помощью eval в функции invoker, но я надеюсь использовать первый метод.

Возможно ли это?

Спасибо,

Алессандро.

1 Ответ

5 голосов
/ 11 февраля 2011

Вы должны создать новую область, в которой будет зафиксировано текущее значение k. JavaScript имеет только область действия функции, поэтому вы можете сделать это с помощью немедленной функции :

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

Вы можете сделать это более читабельным, создав именованную функцию, которая генерирует вашу анонимную функцию:

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

// later

var f = getFunction(k);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...