Я ищу помощь, чтобы понять, почему способ, которым я пользуюсь анонимными функциями, является ошибкой при некоторых обстоятельствах.Анонимная функция как обратный вызов
В нижеприведенном фрагменте я всплываю 2 массива с функциями, которые вызывается на более позднем этапе.
var arr1 = [];
var arr2 = [];
// callback function
var func = function(i){
return function(){$("body").append(i);}
};
var i = 1;
while(i <= 5)
{
arr1.push(function(){$("body").append(i);});
arr2.push(func(i));
i++;
}
// invoke functions
$("body").append("Output from arr1 == ");
for(var c = 0; c < arr1.length; c++){ arr1[c](); }
$("body").append("<br> Output from arr2 == ");
for(var c = 0; c < arr1.length; c++){ arr2[c](); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Теперь, я думаю, я понимаю, почему arr1
выходы 66666
, потому что в момент вызова, i == 6
и becuase ней не были сохранен как пары в этой функции в момент создания, i
сохраняет последнее известное значение?
Что я на самом деле не понимаю, почему я получаю TypeError: arr2[c] is not a function
Когда я изменить функцию обратного вызова:
var func = function(i){
$("body").append(i);
};
Почему это происходит, и это наиболее подходящий/элегантный способ для достижения этой функциональности ,
потому что он не возвращает функцию в последнем случае. Это ничего не возвращает.e 'undefined' –
проверьте, что вы на самом деле нажимаете на массив:' var fn = func (i); console.log (fn, typeof fn); arr2.push (fn); возможно, это поможет вам понять вашу проблему. – Thomas