#javascript
#javascript
Вопрос:
Я прочитал () в конце закрытия, и оно будет выполнено немедленно. Итак, в чем разница между этими двумя. Я увидел первое использование в каком-то коде.
Спасибо.
for (var a=selectsomeobj(),i=0,len=a.length;i<len; i){
(function(val){
anotherFn(val);
})(a[i]);
}
for (var a=selectsomeobj(),i=0,len=a.length;i<len; i){
anotherFn(a[i]);
}
Ответ №1:
В этом примере нет различий. В обоих случаях anotherFn
выполняется немедленно.
Однако функция immediate часто используется, когда функция создается в цикле.
Рассмотрим этот пример (более или менее псевдокод):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
Поскольку JavaScript имеет только область действия функции, без области действия блока, все обработчики событий используют одно и то же значение i
, которое будет иметь значение 10
после завершения цикла. Таким образом, каждый обработчик будет пытаться предупредить values[10]
.
С помощью функции immediate вводится новая область видимости, которая «фиксирует» текущее значение переменной цикла:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
Поскольку это иногда трудно прочитать, часто лучше создать отдельную функцию, которая возвращает другую функцию:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
Комментарии:
1. Я получаю синтаксическую ошибку при попытке использовать for (var i от 1 .. 10) {}
2. @cf_PhillipSenn: Да, это не JavaScript. Обратите внимание, что я написал «Рассмотрим этот пример (более или менее псевдокод ):»
Ответ №2:
В обоих случаях в вашем примере значения выполняют идентичные операции. Существуют и другие примеры, когда, если вы не будете осторожны при использовании первого метода (с самоисполняющейся анонимной функцией), значение i
увеличится и не будет правильно передано вашей функции.
Вот руководство, прокрутите вниз до раздела «создание замыканий в циклах: распространенная ошибка«, чтобы увидеть проблему:
Ответ №3:
первый определяет самозапускающуюся функцию (которая, в свою очередь, выполняет функцию), второй просто выполняет функцию. В обоих случаях аргумент, передаваемый в, является[i].
Комментарии:
1. любая разница в эффекте.. или программа ведет себя так же?
2. я добавил ссылку, объясняющую самозапускающуюся функцию — в данном случае нет причин ее использовать.
3. Нет, в этом случае нет никакой разницы, потому что закрытие практически пустое.