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
function ($) { ... }(window.jQuery);
... не вызывает функцию немедленно. Он вводит SyntaxError, поэтому вам нужен!
(или любой оператор, который заставит функцию интерпретироваться как часть выражения). - person I Hate Lazy   schedule 28.11.2012