Объявление функции и выражение функции, присвоенные переменной, ведут себя одинаково после установления привязки.
Однако существует разница в как и , когда объект функции фактически связан с его переменной. Это различие связано с механизмом, называемым подъемом переменной в JavaScript.
По сути, все объявления функций и объявления переменных подняты наверх функции , в которой происходит объявление (поэтому мы говорим, что JavaScript имеет область действия ). 1015 *
Когда объявление функции поднято, тело функции «следует»
поэтому, когда тело функции вычисляется, переменная немедленно
быть привязанным к функциональному объекту.
Когда объявление переменной поднято, инициализация не
следовать, но "оставлен позади". Переменная инициализируется как
undefined
в начале тела функции и будет назначено
значение в исходном месте в коде. (На самом деле, ему будет присвоено значение в каждом месте, где происходит объявление переменной с тем же именем.)
Порядок подъема также важен: объявления функций имеют приоритет над объявлениями переменных с тем же именем, а последнее объявление функции имеет приоритет над предыдущими объявлениями функций с тем же именем.
Некоторые примеры ...
var foo = 1;
function bar() {
if (!foo) {
var foo = 10 }
return foo; }
bar() // 10
Переменная foo
выводится в начало функции, инициализируется undefined
, так что !foo
равен true
, поэтому foo
назначается 10
. foo
вне области действия bar
не играет никакой роли и остается нетронутым.
function f() {
return a;
function a() {return 1};
var a = 4;
function a() {return 2}}
f()() // 2
function f() {
return a;
var a = 4;
function a() {return 1};
function a() {return 2}}
f()() // 2
Объявления функций имеют приоритет над объявлениями переменных, а последнее объявление функции «залипает».
function f() {
var a = 4;
function a() {return 1};
function a() {return 2};
return a; }
f() // 4
В этом примере a
инициализируется объектом функции, полученным в результате оценки второго объявления функции, а затем присваивается 4
.
var a = 1;
function b() {
a = 10;
return;
function a() {}}
b();
a // 1
Здесь объявление функции сначала поднимается, объявляя и инициализируя переменную a
. Далее этой переменной присваивается значение 10
. Другими словами: присваивание не присваивается внешней переменной a
.