2014-12-30 2 views
2

Может кто-нибудь объяснить, почемуОдновременно Объявление переменных и функций в JavaScript

function x() { 
    console.log("Hello!"); 
} 
var a = x; 
a(); 
x(); 

производит

Здравствуйте!
Здравствуйте!

но

var a = function x() { 
    console.log("Hello!"); 
} 
a(); 
x(); 

выдает ошибку при попытке вызова функции х? Является ли вторая функция x не считающейся подъемной функцией? Я пробовал это как в узлах, так и в браузере.

+0

Я думаю, что единственное место, где х пригодные в второй блок кода изнутри (т.е. рекурсия). Не уверен, почему это так, хотя ... – syazdani

+0

Все ваши вызовы функций поступают после объявлений функций, поэтому это не имеет никакого отношения к подъему. – dursk

ответ

5

Что вы имеете во втором примере - это то, что называется named function expression.

Его имя не добавляется вмещающим объем, но доступно в пределах самой функции:

var a = function x() { 
    alert(x); 
}; 
a(); 

Это полезно в написании рекурсивных функций или функций, которые в противном случае ссылаются на себя, так как она гарантирует, что имя не будет сбито из-за чего-либо, что происходит вне сферы действия.

Она также позволяет создавать автореферентную функцию в тех местах, где вы не можете использовать объявление функции, например, в виде литерала объекта:

var myFavoriteFunctions = { 
    factorial: function f(n) { 
     return n === 1 ? 1 : n * f(n); 
    }, 
    identity: function (v) { return v; } 
}; 

console.log(myFavoriteFunctions.factorial(10)); 
2

Ваш первый пример - это оператор функции, который объявляет имя в своей области.

Ваш второй пример - это именованное функциональное выражение, которое этого не делает.

Для получения дополнительной информации см. here.

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