Во многих книгах/blog posts самости вызова анонимной шаблон функции записывается следующим образом:В чем разница между этой прямоприменяемой анонимной функцией (ака IIFE) реализациями
(function() {
var foo = 'bar';
})();
Однако работает JSLint на это дает это погрешность:
Move the invocation into the parens that contain the function.
eg изменить его на это работает:
(function() {
var foo = 'bar';
}());
Вопросы
- Почему первая реализация не достаточно хорош для JSLint? Каковы различия?
- Какая форма является предпочтительной? JSLint всегда прав?
- Почему это работает? в конце концов
function(){}()
throws aSyntaxError: Unexpected token (
Но обертывание его с помощью парсеров делает его внезапной работой? например (function(){}()
) - работает отлично
(После того, как все это JavaScript, а не Lisp, так что эффект упаковки Паренс на ошибку синтаксиса ohterwise?)
EDIT: это (я бы не сказал точного дубликата): JSLint error: "Move the invocation into the parens that contain the function", поэтому мой главный вопрос №3, почему он вообще работает?
Многие, много дубликатов. Короче говоря, 1-2: Потому что Крокфорд предпочитает так. JSHint был создан только потому, что JSLint слишком предвзято. 3. Поскольку идентификатор является необязательным для выражений функций, в то время как он является обязательным для объявления функции (parens делают это выражением функции). См. Http://kangax.github.io/nfe/#expr-vs-decl –
Я не использую JSLint. Если вы это сделаете, поймите, что это предвзятый инструмент. Я * предпочитаю * последовательно использовать форму '; (function ..)()' - ведущий ';' предотвращает потенциально более неясную ошибку. Обе формы приводят к эквивалентным деревьям синтаксиса. – user2246674
@ user2246674 Вы ошиблись в H за L? ': P' –