Отрицание самопризывающей функции?!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(); }