! function() {}() vs (function() {})()

При просмотре кода, написанного в Javascript Twitter Bootstrap, похоже, что они вызывают немедленные вызовы анонимных функций следующим образом:

!function( $ ) {

     ...

}(window.jQuery || window.ender);

В тех случаях, когда я традиционно видел, что это то же самое делало так:

(function($) {

    ...

})(window.jQuery || window.ender);

Первый способ кажется немного взломанным, и я не уверен, есть ли какая-либо польза или причина для этого, а не второй способ? Обратите внимание, что я понимаю, как это работает, я хочу понять, почему они выбрали этот способ для этого.

Ответ 1

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

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

base.js

var lol = function() {
   alert(arguments[0]);
}

им-CONCAT к base.js

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

jsFiddle.

Бросьте в ведущую ;, и она работает...

jsFiddle.

... или !, например, Bootstrap Twitter...

jsFiddle.

Ответ 2

Это оба пути преодоления двусмысленности в грамматике. Ни один из них не более "хакерский", чем другой. Это просто выбор стиля.

Вы также можете сделать это:

0 + function( $ ) {
  // ...
} ( window.jQuery || window.ender );

Или:

parseInt(function( $ ) {
  // ...
} ( window.jQuery || window.ender ) );

Ответ 3

Вместо шага оценки !undefined вы также можете использовать оператор void для устранения двусмысленности:

void function($) {
     ...
}(window.jQuery || window.ender);

Имеет какое-то качество C, -)

Ответ 4

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