Вызов анонимной функции Javascript
Я читал источники JS из Twitter — на моем пути улучшить мою базу знаний JS, когда я столкнулся с странным способом вызова анонимной функции:
!function( $ ) {
...
}( window.jQuery );
... и это работает!:)
Для всех очевидно, что это:
function ( $ ) { ... } ( window.jQuery )
не работает (ошибка синтаксиса), в то время как это верно:
(function ( $ ) { .... })( window.jQuery )
Может кто-нибудь объяснить эту магию (почему работает с !function
)?
Ответы
Ответ 1
Когда ключевое слово function
выполняется в позиции оператора (в качестве первого токена в инструкции), объявление функции выражается как оператор функции. Операторы функций поднимаются в верхнюю часть области, не могут быть немедленно вызваны и должны иметь имя.
Когда ключевое слово встречается в позиции выражения (т.е. не как первый токен в выражении, в вашем примере !
- первый токен), объявление функции выражается как выражение функции, которое может быть анонимным и возвращает значение вновь созданной функции. Поскольку он возвращает значение вновь созданной функции, вы можете сразу вызвать ее, добавив в нее скобки.
Обтекание декларации внутри скобок делает то же самое, но чаще встречается с префиксом !
или +
:
(function () {
...
}());
Ответ 2
Вторая форма function () {}
- это утверждение. Оператор !
преобразует это в выражение. Вы также найдете случаи, когда люди используют -
или +
перед ключевым словом function
.
Если у вас есть выражение, оценивающее функцию, вы можете вызвать эту функцию с помощью оператора ()
.
Другой (возможно, более простой для понимания) способ достижения эффекта сохранения аналогичен другому набору круглых скобок:
( function(x) { body; } )(arg);
Поместив функцию внутри скобки, вы снова преобразуете ее в выражение, которое оценивает функцию. Эта функция вызывается с arg
в качестве аргумента.
Ответ 3
Что касается восклицательного знака, это не волшебство.
Он преобразует результат в true/false.
Ваша проблема может заключаться в том, что ваша анонимная функция имеет внутри нее ошибку.
Ответ 4
это звучит как ошибка синтаксиса javascript:
названная функция может быть оператором, однако анонимная функция просто рассматривает ее как выражение.
Pro:
вы можете сделать function() { ... }()
Con:
вы не можете сделать function() { ... }
Но почему люди хотели бы определить анонимную функцию, не вызвав ее? Таким образом, конфликт не вызывает беспокойства.