отрицание функции самовызова? ! функция ($) {} (window.jQuery);

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

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

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

Но для чего нужен !?


person Hailwood    schedule 28.11.2012    source источник
comment
См .: stackoverflow.com/questions/5827290/   -  person c-smile    schedule 28.11.2012
comment
function ($) { ... }(window.jQuery); ... не вызывает функцию немедленно. Он вводит SyntaxError, поэтому вам нужен ! (или любой оператор, который заставит функцию интерпретироваться как часть выражения).   -  person I Hate Lazy    schedule 28.11.2012
comment
Да, я забыл принять во внимание, как я обычно оборачиваю его в (), который, как я теперь знаю, совпадает с!   -  person Hailwood    schedule 28.11.2012


Ответы (1)


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

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

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

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

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

Итак, когда вы пишете:

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

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

В дальнейшем, если вы не дадите своему объявлению функции имя:

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

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

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

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

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

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

... так что, если вы действительно, ДЕЙСТВИТЕЛЬНО захотите, вы можете сделать что-то вроде:

var success = !function () { /* ... */ }();
if (success) { doStuff(); }
person Norguard    schedule 28.11.2012