Синтаксис виклику негайної функції


110

Існує варіант JSLint , одна з хороших частин насправді, що "[вимагає] паронів навколо негайних викликів", що означає, що конструкція

(function () {

  // ...

})();

замість цього потрібно писати як

(function () {

  // ...

}());

Моє запитання таке: чи може хтось пояснити, чому ця друга форма може вважатися кращою? Це більш стійкий? Менше схильних до помилок? Яку перевагу він має перед першою формою?


Задавши це запитання, я зрозумів важливість чіткого візуального розмежування значень функцій та значень функцій. Розглянемо випадок, коли результатом негайного виклику є права частина виразу призначення:

var someVar = (function () {

  // ...

}());

Хоча самі зовнішні дужки є синтаксично непотрібними, що відкриваються дужки дають попередній показник того, що присвоєне значення не є самою функцією, а результатом викликаної функції.

Це схоже на поради Крокфорда щодо капіталізації функцій конструктора - він повинен слугувати візуальною підказкою для всіх, хто дивиться на вихідний код.


Дякуємо, що вказали на це. Я так і не знайшов способу позбутися попереджувального повідомлення JSLint "Будьте обережні, роблячи функції в циклі". Я був обережним і поклав цю функцію на закриття, але JSLint все ще скаржився. Тепер я знаю, що передбачалося, що я використовував другий зразок.
viam0Zah


Я робив це "неправильно" весь цей час. І коли я кажу "весь цей час", я пишу JavaScript з 1995 року.
Дейв Ленд,

Відповіді:


73

З посібника з конвенції про стиль Дугласа Крокфорда : (пошук "негайно викликається")

Коли функцію потрібно негайно викликати, весь вираз виклику слід загортати в парени, щоб було зрозуміло, що створене значення є результатом функції, а не самою функцією.

Таким чином, він, на його думку, робить більш чітким розмежування значень функції та значень функцій. Отже, це стилістична справа, а не насправді істотна різниця в самому коді.

оновлена ​​довідка, старого PPT більше не існує


1
Я радий, що прочитав це. Я щойно закінчив читати Javascript: Хороші частини, і я думав про те, що присвоєння результату виклику функції - це справді поганий синтаксис, адже вам потрібно подивитися перший і останній рядки, щоб зрозуміти, що відбувається. Він не використовує обгорткові парен у книзі, але я точно бачу, чому він рекомендує їх.
Skilldrick

2
@altCognito, чи можете ви надати нове посилання для PPT?
th1rdey3

1
Я переглянув Інтернет, але досі не можу знайти копію цього PPT
Forethinker

1
Я не зміг знайти оригінальний PPT, але мені вдалося знайти ту саму точку, яку я знайшов у його посібнику з конвенції JavaScript.
cgp

archive.org це?
Джон Грін

2

Анонімні функції, що негайно викликаються, загортаються в парени, оскільки:

  1. Вони є функційними виразами, і виведення паролів не спричинить його інтерпретацію як декларацію функції, яка є помилкою синтаксису.

  2. Вирази функцій не можуть починатися із функції слова.

  3. При призначенні виразу функції змінній, сама функція не повертається, повертається значення функції, отже, парени оцінюють, що знаходиться всередині них, і створюють значення.коли функція виконується, і відстежуючі паролі ..}()викликають негайне виконання функції.


Датане, ти відповідаєш на інше запитання. Ви вірні, що дужки, що додаються, іноді є синтаксично необхідними, щоб аналізатор міг відрізняти вирази функцій від оголошень функції. Але моє запитання стосується розміщення дужок виклику. Ви третій пункт неточний; дужки, що додаються, в цьому випадку непотрібні.
Боббі Ейкхофф

Я відповідав на ваш перший приклад, коли функція негайно викликаної анонімної функції не була призначена змінній, і тому дужки в синтаксичному порядку необхідні з перших двох причин. Третя причина була лише відновленням того, що ви навіть сказали: "вхідні дужки дають попереднє вказівку на те, що присвоєне значення - це не сама функція, а результат викликаної функції". Але я думаю, це було не ясно.
Датан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.