JavaScript 提升 - 内存创建阶段后的提升代码
JavaScript Hoisting - Hoisted code after Memory Creation phase
我正在读凯尔辛普森的书:https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/scope%20%26%20closures/ch4.md#functions-first。
但我不完全理解这一行 "请注意,var foo 是重复的(因此被忽略的)声明,即使它出现在函数 foo() 之前。 .. 声明,因为函数声明在普通变量之前被提升。"
假设这是代码:
console.log(foo); // The output is: foo() { return 2; }
function foo() {
return 1;
}
function foo() {
return 2;
}
var foo = 3;
我想可视化在内存创建阶段后 JS 引擎中的输出是什么。会这样吗?
function foo() {
return 2;
}
console.log(foo);
如果是,为什么var foo = 3;
被忽略了?片段中 var
没有重复项。如果不是,谁能帮我想象一下内存创建阶段后 JS 引擎的输出是什么?
谢谢
- 函数声明
- 声明一个与函数同名的变量(这是提升的)
- 将函数分配给该变量(已提升)
var
语句与关联赋值
- 声明一个具有该名称的变量(已提升)
- 将值分配给该变量(这是未提升)
var foo = 3
不忽略
变量声明 (var foo
) 被忽略,因为之前的函数声明已经声明了该变量。 (即因为它重复了 foo
的声明)。
foo = 3
不会被忽略,并且会将 3
分配给 foo
......它只是这样做 after 你的 console.log
声明运行,因为它没有托管。
我觉得文中指的是
// scope creation
var foo; // the name was declared. Thrice.
foo = undefined; // from the var
foo = function foo() { return 1 }; // from the first declaration
foo = function foo() { return 1 }; // from the second iteration
// execution
console.log(foo);
;
;
foo = 3;
其中 foo
由于 var foo
声明而使用 undefined
初始化,但随后被优先的 function foo
声明的初始化值覆盖 - 无论根据声明在代码中出现的顺序,function
个声明优先于 var
个声明。
我正在读凯尔辛普森的书:https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/scope%20%26%20closures/ch4.md#functions-first。
但我不完全理解这一行 "请注意,var foo 是重复的(因此被忽略的)声明,即使它出现在函数 foo() 之前。 .. 声明,因为函数声明在普通变量之前被提升。"
假设这是代码:
console.log(foo); // The output is: foo() { return 2; }
function foo() {
return 1;
}
function foo() {
return 2;
}
var foo = 3;
我想可视化在内存创建阶段后 JS 引擎中的输出是什么。会这样吗?
function foo() {
return 2;
}
console.log(foo);
如果是,为什么var foo = 3;
被忽略了?片段中 var
没有重复项。如果不是,谁能帮我想象一下内存创建阶段后 JS 引擎的输出是什么?
谢谢
- 函数声明
- 声明一个与函数同名的变量(这是提升的)
- 将函数分配给该变量(已提升)
var
语句与关联赋值- 声明一个具有该名称的变量(已提升)
- 将值分配给该变量(这是未提升)
var foo = 3
不忽略
变量声明 (var foo
) 被忽略,因为之前的函数声明已经声明了该变量。 (即因为它重复了 foo
的声明)。
foo = 3
不会被忽略,并且会将 3
分配给 foo
......它只是这样做 after 你的 console.log
声明运行,因为它没有托管。
我觉得文中指的是
// scope creation
var foo; // the name was declared. Thrice.
foo = undefined; // from the var
foo = function foo() { return 1 }; // from the first declaration
foo = function foo() { return 1 }; // from the second iteration
// execution
console.log(foo);
;
;
foo = 3;
其中 foo
由于 var foo
声明而使用 undefined
初始化,但随后被优先的 function foo
声明的初始化值覆盖 - 无论根据声明在代码中出现的顺序,function
个声明优先于 var
个声明。