Подтвердить что ты не робот

Вызов анонимной функции Javascript

Я читал источники JS из Twitter — на моем пути улучшить мою базу знаний JS, когда я столкнулся с странным способом вызова анонимной функции:

!function( $ ) {
    ...
}( window.jQuery );

... и это работает!:)

Для всех очевидно, что это:

function ( $ ) { ... } ( window.jQuery )

не работает (ошибка синтаксиса), в то время как это верно:

(function ( $ ) { .... })( window.jQuery )

Может кто-нибудь объяснить эту магию (почему работает с !function)?

4b9b3361

Ответ 1

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

Когда ключевое слово встречается в позиции выражения (т.е. не как первый токен в выражении, в вашем примере ! - первый токен), объявление функции выражается как выражение функции, которое может быть анонимным и возвращает значение вновь созданной функции. Поскольку он возвращает значение вновь созданной функции, вы можете сразу вызвать ее, добавив в нее скобки.

Обтекание декларации внутри скобок делает то же самое, но чаще встречается с префиксом ! или +:

(function () {
    ...
}());

Ответ 2

Вторая форма function () {} - это утверждение. Оператор ! преобразует это в выражение. Вы также найдете случаи, когда люди используют - или + перед ключевым словом function.

Если у вас есть выражение, оценивающее функцию, вы можете вызвать эту функцию с помощью оператора ().

Другой (возможно, более простой для понимания) способ достижения эффекта сохранения аналогичен другому набору круглых скобок:

( function(x) { body; } )(arg);

Поместив функцию внутри скобки, вы снова преобразуете ее в выражение, которое оценивает функцию. Эта функция вызывается с arg в качестве аргумента.

Ответ 3

Что касается восклицательного знака, это не волшебство. Он преобразует результат в true/false.

Ваша проблема может заключаться в том, что ваша анонимная функция имеет внутри нее ошибку.

Ответ 4

это звучит как ошибка синтаксиса javascript:

названная функция может быть оператором, однако анонимная функция просто рассматривает ее как выражение.

Pro: вы можете сделать function() { ... }()

Con: вы не можете сделать function() { ... }

Но почему люди хотели бы определить анонимную функцию, не вызвав ее? Таким образом, конфликт не вызывает беспокойства.