Это потому что
function($) {} (window.jQuery);
недопустимо в синтаксисе, но
!function($) {} (window.jQuery);
действителен.
Теперь вопрос, почему первый случай недействителен?
Давайте сначала посмотрим на это. И анонимные функции, и именованные функции могут рассматриваться как выражение , например,
0 + function(y) { return y; } (1);
0 + function x(y) { return y; } (1);
оба действительны.
Тогда рассмотрим эту ситуацию, это утверждение содержит одно выражение
function x(y) {
return y;
}
(1);
"Это неправильно!" Можете ли вы сказать, что, поскольку вы знаете, что это на самом деле одно определение функции и одно выражение с одним выражением (1)
.
Правда в том, что эти коды неоднозначны для синтаксического анализатора, потому что он может быть разрешен либо как одна функция и одно выражение в скобках, либо как вызов функции. Чтобы избежать такого рода двусмысленности, Javascript регламентирует, что , если function
встречается как первый токен оператора, оператор должен быть определением функции . Так что function($) {} (window.jQuery);
недопустимо в синтаксисе, потому что это недопустимое определение функции. Но предложите !
или даже такой код действителен
0 + function x(y) {
return y;
}
(1);
Это один оператор с двоичным плюсом, чья rhs - это вызов функции внутри него.