Проблема в том, что все эти функции "playAnswer" заключены в одну и ту же переменную "i". То есть есть только одно «я» (и в этом случае, поскольку вы не объявили его с помощью var
, оно глобально!).
Вам нужно использовать еще одну функцию для предоставления отдельного «i» для каждого из обратных вызовов.
function addPlayAudioMethodToExerciseArray(){
function makePlayerCallback(i) {
return function() {
$('#jPlayer' + i).jPlayer('play', 0);
};
}
for (var i = 0; i < qaArray.length; ++i){
qaArray[i].playAnswer = makePlayerCallback(i);
}
}
Функция «makePlayerCallback» имеет свой собственный параметр «i», который, будучи эффективно локальным по отношению к этой функции , приведет к функциям обратного вызова, которые имеют свои собственные «i» по отдельности. Каждый вызов этой функции создает то, что называется «замыканием» вокруг возвращенной функции обратного вызова. (Обратите внимание, что мой цикл начинается с нуля; если ваши идентификаторы в HTML начинаются с 1, вам необходимо учесть это, добавив куда-нибудь 1. Спасибо @DieVarDump за эту заметку.)
Обратите внимание, что я объявил "i", используемый в цикле с var
, чтобы сделать его локальным для "addPlayAudioMethodToExerciseArray" (мальчик, это длинное имя функции; я надеюсь, вам не придется вводить его слишком часто :-) , Кроме того, я использовал его в качестве числового индекса, предполагая, что «qaArray» - это действительно честный массив, а не просто n-объект. Рекомендуется использовать числовое индексирование для массивов.