Самовозвратные функции JavaScript

Возможный дубликат:
Разница между (function () {}) (); и function () {} ();
"(Function () {}) ()" и "(function () {} ())" функционально равны в JavaScript?

Мне просто интересно, есть ли разница (в отношении функциональности) между этими двумя примерами:

первый

(function foo() {
console.log("bar")
})()

второй

(function foo() {
console.log("bar")
}())

Оба, кажется, работают нормально...

Спасибо!

3 ответа

Решение

Они точно такие же. Между этими двумя понятиями нет никакой разницы с точки зрения эффективности, производительности или использования. Использование любого из них является вопросом предпочтения.

Хотя существует более короткая вариация двух форм, обычно используемых шахтерами JS. То есть логично NOT-написание выражения функции и вызов его:

!function() {
    console.log( x );
}();​

Нет разницы. На самом деле, вам нужно использовать () только потому, что просто...

function() { console.log('bar'); } ();

... не будет правильно распознан парсером JS. Как сказано в стандарте ES5:

Кроме того, ExpressionStatement не может начинаться с ключевого слова function, потому что это может сделать его неоднозначным с FunctionDeclaration.

Альтернатива (для (...)) решение дополняет это утверждение некоторым унарным оператором. И то и другое...

+function() { console.log('bar'); } ();

... а также...

!function() { console.log('bar'); } ();

... буду работать.

Там нет никакой разницы между ними. Оба сразу вызывают выражения функций. Некоторые люди, такие как Дуглас Крокфорд, предпочитают второй метод. Некоторые предпочитают первое. Интересно, что JSLint Крокфорда не позволяет первый метод, поэтому я предполагаю, что второй является более распространенным.

Да, и если вы используете объявление функции вместо выражения функции, вы можете вызвать функцию до того, как она появится в программе. Это потому, что объявления поднимаются в JavaScript:

greet(); // This will work

function greet() {
    alert("Merry Christmas!");
}

То же самое не верно для выражений функций:

greet(); // This will not work

var greet = function greet() {
    alert("Merry Christmas!");
};

Это почти все, что вам нужно знать на данный момент.

Другие вопросы по тегам