Я видел:
!function(){ //code }();
Используется в нескольких местах для немедленного выполнения анонимной функции. Обычно он используется вместо:
(function(){ //code }())
Кто-нибудь знает, как функция !
фактически выполняет функцию?
Я видел:
!function(){ //code }();
Используется в нескольких местах для немедленного выполнения анонимной функции. Обычно он используется вместо:
(function(){ //code }())
Кто-нибудь знает, как функция !
фактически выполняет функцию?
Что! делает
Когда вы используете !
, функция становится единственным операндом унарного (логического) оператора NOT.
Это заставляет функцию оцениваться как выражение, которое позволяет ей немедленно вызывать inline.
Другие альтернативы
Вы можете сделать это практически с любым оператором. Вот несколько примеров...
'invoke',function(){ /*code*/ }();
1+function(){ /*code*/ }();
void function(){ /*code*/ }();
~function(){ /*code*/ }();
+function(){ /*code*/ }();
Хорошая вещь о некоторых из них заключается в том, что смысл оператора не перегружен.
Проблема с ()
Когда вы используете ()
вокруг функции, вы можете поразить некоторые ошибки, которые будут возникать, если у вас есть несколько строк без разделительной точки с запятой.
(function() {
alert('first');
}())
(function() {
alert('second');
}())
// TypeError: undefined is not a function
Это приведет к TypeError
, потому что пара внешних ()
вокруг второй функции будет интерпретироваться как намеревающаяся вызвать функцию. Первый не возвращает функцию, конечно, поэтому вы пытаетесь вызвать undefined
.
Как использование другого оператора справляется с (или избегает) проблемы
Даже такой оператор, как +
, который перегружен до некоторой степени, не приведет к ошибке.
Если вы сделаете это...
+function() {
alert('first');
}()
+function() {
alert('second');
}()
Первый +
интерпретируется как унарный + оператор и преобразует результат, возвращенный из первой функции, которая в этом случае undefined
, поэтому она преобразуется в NaN
.
Второй +
будет интерпретироваться как оператор сложения, и поэтому попытается добавить NaN
к результату возврата второй функции, которая снова здесь undefined
.
Результат, конечно, NaN
, но он безвреден. Нет никакого незаконного кода, чтобы вывести ошибку.
Демонстрация взаимодействия операторов с функциями
Чтобы доказать это, просто дайте каждой функции возвращаемое значение, затем вставьте ее в консоль...
+function() {
alert('first');
return "10";
}()
+function() {
alert('second');
return 20;
}()
// 30
Вы получите два alert
s, а затем консоль покажет 30
, потому что первый оператор +
преобразует строку "10"
в число 10
, а второй +
добавлен два результата вместе.
!
- обычное логическое отрицание.
Функция ()
выполняет функцию.