2012-01-25 4 views
6

Возможный дубликат:
!function(){ }() vs (function(){ })()В чем разница между функцией() {}() и функции() {}()

Так что я был просто чтение через источник новый Bootstrap (2.0) из Twitter и заметил, что перед анонимной функцией самозапускания есть восклицательный знак. Когда я увидел это, я сразу подумал: «О, дерьмо, есть новый, лучший способ сделать это?».

Посмотрите сами!

В любом случае, какая разница? Должна быть причина для этого, потому что они последовательно используют его во всех своих плагинах JavaScript (для Bootstrap).

Еще одна вещь, которую я заметил, - это «использовать строгий» сразу после этого. Я не думаю, что это связано с моим предыдущим запросом, но может ли кто-нибудь объяснить это?

Спасибо!

ответ

14
function(){}(); 

Сама по себе (см комментарий Point,) не будет действительным, так как

function() {} 

является объявлением функции. Чтобы немедленно вызвать его, вам нужно заставить механизм JavaScript рассматривать функцию как выражение . Люди обычно делают это как-либо из

(function(){})(); //more common 

(function(){}()); // Papa Crockford's preference: 

с

!function(){}(); 

просто быть сокращенной версией того же.

+2

+1. Вы в огне! – gdoron

+0

+1 Хотя позже это не требуется, но хорошая практика, подходящая к Doughlas Crackford :) – Sarfraz

+0

@gdoron - и теперь я закрыт. Вернемся к работе :) –

8

Если у вас есть 2 сценариев:

script1.js:

(function(){ 

})() 

script2.js:

(function(){ 

})() 

И вы сцепить их, вы получите:

(function(){ 

})() 
(function(){ 

})() 

Это вызывает ошибку, в то время как:

!function(){ 

}() 
!function(){ 

}() 

Это не так.

+0

+1 Это полезно знать. – Sarfraz

+0

Это также причина, по которой некоторые скрипты используют точку с запятой в начале: '; (function() {}())' – hugomg

+1

Итак, можно ли с уверенностью сказать '; (function() {}())' и ' ! Функция() {}() 'служит той же цели? – Johnny

3

ECMAScript Language Specification, раздел 12.4, говорит:

ExpressionStatement не может начать с function ключевым словом, потому что может сделать неоднозначный с FunctionDeclaration.

Так что если вы хотите, чтобы оператор выражения выполнял анонимную функцию, вам нужно обойти это ограничение. Добавление ! (что просто отрицает результат функции) дает понять интерпретатору, что это не объявление функции, избегая этой двусмысленности.

Смежные вопросы