JavaScript 变量声明前后?
JavaScript variable before and after declaration?
function a(){
console.log(typeof b); // function
function b() {
var c = 52;
console.log(c);
}
var b = 88;
console.log(typeof b); // number
}
任何人都可以回答,javaScript 如何编译或处理这种特殊情况?我知道 javaScript 在谈到 hoisting
时优先考虑 function
声明。但是,同一个 identifier
b
如何在同一个块或同一个词法范围内保存两个不同的值?
有人可能会说,好吧,我将在声明之前将 b
用作 function
,并在分配 number
后用作 number
。
你可以这样理解代码执行有两个阶段
Creation phase
Execution phase
创建阶段:-创建阶段函数原样吊顶,变量吊顶但没有分配给它的值(或者你可以说它的值是未定义的)
执行阶段:- 在执行上下文期间,它会在到达发生赋值的行时为变量赋值
所以在你的代码中 creation phase
函数 b 被提升,编译器会像这样读取它
function a(){
function b(){
var c = 52;
console.log(c);
}
console.log(typeof b); // function
b = 88;
console.log(typeof b); // number
}
所以当你到达那条线时
b = 88
它为number
类型的变量b
分配一个新值
据我所知,这不是两个不同的参考文献。
在内部,
function b(){/*Code Here*/}
执行为 var b = function(){/*Code Here*/}
因此,第一个 typeof(b)
returns 函数 .
并且当var b = 88;
执行时,这基本上将88分配给b的已经存在的引用。
因此,第二个 typeof(b)
returns number.
运行时图片供参考:
在这种情况下,提升发生如下:
- 声明
var b
,没有初始化
- 声明
function b
,它覆盖了 var 声明
- 将值
88
赋值给变量b
所以函数实际上被转换为 "logical equivalent" of:
function a(){
var b; // hoisted
b = function b(){ // hoisted
var c = 52;
console.log(c);
}
console.log(typeof b); // function
b = 88;
console.log(typeof b); // number
}
function a(){
console.log(typeof b); // function
function b() {
var c = 52;
console.log(c);
}
var b = 88;
console.log(typeof b); // number
}
任何人都可以回答,javaScript 如何编译或处理这种特殊情况?我知道 javaScript 在谈到 hoisting
时优先考虑 function
声明。但是,同一个 identifier
b
如何在同一个块或同一个词法范围内保存两个不同的值?
有人可能会说,好吧,我将在声明之前将 b
用作 function
,并在分配 number
后用作 number
。
你可以这样理解代码执行有两个阶段
Creation phase
Execution phase
创建阶段:-创建阶段函数原样吊顶,变量吊顶但没有分配给它的值(或者你可以说它的值是未定义的)
执行阶段:- 在执行上下文期间,它会在到达发生赋值的行时为变量赋值
所以在你的代码中 creation phase
函数 b 被提升,编译器会像这样读取它
function a(){
function b(){
var c = 52;
console.log(c);
}
console.log(typeof b); // function
b = 88;
console.log(typeof b); // number
}
所以当你到达那条线时
b = 88
它为number
b
分配一个新值
据我所知,这不是两个不同的参考文献。
在内部,
function b(){/*Code Here*/}
执行为 var b = function(){/*Code Here*/}
因此,第一个 typeof(b)
returns 函数 .
并且当var b = 88;
执行时,这基本上将88分配给b的已经存在的引用。
因此,第二个 typeof(b)
returns number.
运行时图片供参考:
在这种情况下,提升发生如下:
- 声明
var b
,没有初始化 - 声明
function b
,它覆盖了 var 声明 - 将值
88
赋值给变量b
所以函数实际上被转换为 "logical equivalent" of:
function a(){
var b; // hoisted
b = function b(){ // hoisted
var c = 52;
console.log(c);
}
console.log(typeof b); // function
b = 88;
console.log(typeof b); // number
}