Подтвердить что ты не робот

Как работает функция() {}()?

Я видел:

!function(){ //code }();

Используется в нескольких местах для немедленного выполнения анонимной функции. Обычно он используется вместо:

(function(){ //code }())

Кто-нибудь знает, как функция ! фактически выполняет функцию?

4b9b3361

Ответ 1

Что! делает

Когда вы используете !, функция становится единственным операндом унарного (логического) оператора 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, а второй + добавлен два результата вместе.

Ответ 2

! - обычное логическое отрицание.
Функция () выполняет функцию.