Закрытие Javascript

#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 увеличится и не будет правильно передано вашей функции.

Вот руководство, прокрутите вниз до раздела «создание замыканий в циклах: распространенная ошибка«, чтобы увидеть проблему:

https://developer.mozilla.org/en/JavaScript/Guide/Closures

Ответ №3:

первый определяет самозапускающуюся функцию (которая, в свою очередь, выполняет функцию), второй просто выполняет функцию. В обоих случаях аргумент, передаваемый в, является[i].

Комментарии:

1. любая разница в эффекте.. или программа ведет себя так же?

2. я добавил ссылку, объясняющую самозапускающуюся функцию — в данном случае нет причин ее использовать.

3. Нет, в этом случае нет никакой разницы, потому что закрытие практически пустое.