Настройка массива обратных вызовов и попытка использовать индекс массива в качестве значения в обратном вызове - PullRequest
5 голосов
/ 23 января 2011

Когда я настраиваю массив обратных вызовов таким образом, я получаю 20 в диалоговом окне для всех обратных вызовов. Я бы хотел получить индекс в массиве. Это возможно? Функция, которая вызывает обратный вызов, ожидает, что обратный вызов будет иметь один параметр. Я не контролирую вызывающую функцию обратного вызова, потому что она является частью внешней библиотеки. Любая помощь приветствуется.

for (var i = 0; i < 20; i++) {
  callbackDB[i] = function(data) {
    alert(i);
  }
}

Ответы [ 2 ]

11 голосов
/ 23 января 2011

Поскольку i оценивается при вызове функции, вам нужно ограничить это значение i при выполнении новой функции, чтобы сохранить ожидаемое значение.

     // returns a function that closes around the `current_i` formal parameter.
var createFunction = function( current_i ) {
    return function( data ) {
        alert( current_i );
    };
};

     // In each iteration, call "createFunction", passing the current value of "i"
     // A function is returned that references the "i" value you passed in.
for (var i = 0; i < 20; i++) {
  callbackDB[i] = createFunction( i );
}
2 голосов
/ 26 сентября 2016

Другое решение с использованием объекта.

var callbackDB = new Array();

for (var i = 0; i < 20; i++) {
  callbackDB[i] = {
    value: i,
    callback: function() {
      alert(this.value);
    }
  };
}
			
callbackDB[5].callback();

В этом случае необходимо будет вызвать функцию (в примере она называлась «обратный вызов»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...