! 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
Один ответ, который я еще не видел, заключается в том, что он избегает окружения всей вашей функции круглыми скобками. Вне эстетических соображений это может быть плюсом для некоторых редакторов, которые используют круглые скобки для определения уровня отступов строки.