!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.
})();
Бросок в ведущем ;
и она работает...
... или !
как Twitter Bootstrap...
Они оба способа преодолеть неоднозначность в грамматике. Ни один не более "хакерский", чем другой. Это просто выбор стиля.
Вы также можете сделать это:
0 + function( $ ) {
// ...
} ( window.jQuery || window.ender );
Или же:
parseInt(function( $ ) {
// ...
} ( window.jQuery || window.ender ) );
Вместо этапа оценки !undefined
Вы также можете использовать void
Оператор убирает неоднозначность:
void function($) {
...
}(window.jQuery || window.ender);
Имеет своего рода C-качество;-)
Один ответ, который я еще не видел, состоит в том, что он избегает заключать в скобки всю вашу функцию. Помимо эстетических соображений, это может быть плюсом для некоторых редакторов, которые используют скобки для определения уровня отступа строки.