Javascript Self Executing должен работать? - PullRequest
4 голосов
/ 02 ноября 2011

У меня был этот код:

function (i)
{
    alert(i);
}(3);

И это не сработало, поэтому после StackOverFlow Вопрос - я изменил на:

 (function(i){ alert(i); })(3); 

И это работает.

Мне пришлось () обернуть весь код.

Но потом я увидел этот код на другом сайте:

function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i;
        link.onclick = function (num) {
            return function () {
                alert(num);
            };
        }(i); // <=== What about this ? there is no () wrapper... so how does it work ?
        document.body.appendChild(link);
    }
}
window.onload = addLinks;

Я хотел спросить Какова роль для части (i)? выполняет что-то?

И если да, то почему не в виде:

(function(i){ alert(i); })(3);

Я имею в виду , где - обертки () ?

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Компилятор должен различать оператор объявления функции и выражение определения функции. Вы можете вызывать функции только в выражениях.

Когда ключевое слово function появляется после ' = ' или ' (', компилятор знает, что это должно быть определение функции выражение (так как после '=' или '(') допускаются только выражения, а не операторы, что позволяет немедленно вызвать его . Когда ключевое слово функции запускается a В новом операторе компилятор предполагает, что это будет функция объявление оператор и , следовательно, вы не можете немедленно вызвать функцию .

Обратите внимание, что оператор объявления функции требует от вас имени функции. Это позволяет вам позвонить позже. Вы можете опустить имя функции в выражениях определения функции (и можете вызывать их немедленно).

1025 * Отредактировано * Все смелые шрифты были написаны Рой Намиром ОП: эти смелые слова - ключ к пониманию. this is the most logical Explanation after a lot of tests. См.

http://jsbin.com/imetan/edit#javascript,html

0 голосов
/ 02 ноября 2011

Часть (i) передает значение i в качестве параметра анонимной функции (функция без имени), которая объявлена ​​как обработчик события onclick, и все. Он ничего не делает.

Извините, я исправлен ... (i) означает , выполняя функцию, передающую i в качестве параметра. Это приводит к тому, что onclick фактически является такой функцией:

function (num) {
    alert(num);
};

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

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