2016-06-09 4 views
2

Мне нужна помощь в понимании того, как работает следующий скрипт.Зачем эта функция выполняется?

var foo = function() { 
    console.log("A"); 
} 

(function() { 
    // Empty 
}) 

При выполнении этого сценария с узлом (v5.9.1) выход "А". Я бы ожидал, что он просто ничего не сделает. Почему foo здесь? Я могу либо удалить первую, либо последнюю три строки, а затем нет вывода.

  • Редактировать: он работает как ожидается, если я разместил ; после фигурного скобки на линии 3. Но почему?
+1

Вероятно, вы должны положить точку с запятой в строке 3, так как вы заканчиваете свое утверждение. - (Это одна из причин, почему вы не должны полагаться на людей ASI!) – evolutionxbox

ответ

8

Если вы положили (...) сразу после выражения функции, вы выполняете эту функцию.

Код в вопросе определяет функцию, которая вызывает console.log. Затем он вызывает эту функцию (передавая ей аргумент (который не используется) функции, которая ничего не делает). Затем он присваивает возвращаемое значение для вызова первой функции до foo.

Это может быть переписано как:

var function_a = function() {console.log("A");}; 
var function_b = function() {}; 
var foo = function_a(function_b); 

... с единственными побочными эффектами являются созданием function_a и function_b переменных.


вставки Semi-ободочной кишки, как правило, считается вредным, потому что заставляет людей ожидать пробельные отделить заявление в двух неродственных выражений.

JSHint бы предупредить вас о проблеме:

7 Пропавший точкой с запятой.

+0

В чем разница между '(function() {...})()' и 'function() {...}()' тогда? – JAyP

+1

@JAyP 'function() {}()' не является допустимым синтаксисом, если используется один. Он работает в вашем случае, так как 'var foo = ...' превращает его в выражение. – freakish

+0

@JAyP - зависит от того, что появляется в левой части выражения. Если есть что-то еще, что сделает второе выражение функцией выражения, то абсолютно ничего практического эффекта. – Quentin

2

JavaScript интерпретирует (...) как вызов ранее определенную функцию (обратите внимание, что вы передаете другую функцию в качестве аргумента, который игнорируется в foo), так как нет ничего между } и ( символами.

1

С кода

var foo = function() { 
    console.log("A"); 
} 

(function() { 
    // Empty 
}) 

Код JavaScript интерпретатор читает это:

var foo = function() { 
    console.log("A"); 
}(function() {}); 

Для переводчика вы объявили анонимную функцию и передать ей параметр и ничего не возвращает, то значение foo is undefined

Вот почему очень важно поставить ; на каждом конце линии, когда это необходимо.