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

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

!function( $ ) {

     ...

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

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

(function($) {

    ...

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

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

4 ответа

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

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

base.js

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

им-CONCAT к base.js

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

jsFiddle.

Бросок в ведущем ; и она работает...

jsFiddle.

... или ! как Twitter Bootstrap...

jsFiddle.

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

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

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

Или же:

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

Вместо этапа оценки !undefined Вы также можете использовать void Оператор убирает неоднозначность:

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

Имеет своего рода C-качество;-)

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

Другие вопросы по тегам