Отрицание самопризывающей функции?!function ($) { ... }(window.jQuery);

Возможный дубликат:
Что делает восклицательный знак перед функцией?

Я просматривал код JavaScript Twitter Bootstrap и заметил, что все их плагины обернуты в функции самоотзывания.

Я знаю что function ($) { ... }(window.jQuery); вызывает функцию немедленно.

Но что это ! за?

1 ответ

Решение

1) если вы просто делаете:

function () { /* ... */ }();

Вы получите ошибку.
JS не позволит вам запустить объявление функции (из-за концепции "поднятия переменной", которая не является технически правильной, но для многих людей гораздо проще думать).
Если вы используете декларативные функции:

function myFunc () { /* ... */ }

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

Поэтому, когда вы пишете:

function myFunc () { /* ... */ }();

Там есть ошибка, потому что в текущей области видимости могут вызываться переменные, которые еще даже не существуют, что является гарантированным сбоем.

Для этого, если вы не дадите своему объявлению функции имя:

function () { /* ... */ }

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

Операторы как () или же + или же ! - все, что заставит двигатель оценивать все, что будет дальше, позволит вам запустить такую ​​функцию, как:

+function () { /* ... */ }();

Пока нет никакой переменной, слушающей оператор return, все в порядке.

2) Кроме того, в случае !function () { /*...*/ }();, если эта функция не имеет оператора возврата естественно, то она вернет undefined,
Противоположно undefined является true когда принужден таким образом...

... так что если вы действительно, действительно хотели, вы могли бы сделать что-то вроде:

var success = !function () { /* ... */ }();
if (success) { doStuff(); }
Другие вопросы по тегам