function a(){
console.log(typeof b); // function
function b() {
var c = 52;
console.log(c);
}
var b = 88;
console.log(typeof b); // number
}
任何人都可以回答,javaScript如何编译或处理这种特殊情况?我知道在涉及function
时,javaScript优先考虑hoisting
声明。但是,相同的identifier
b
在相同的块下或在相同的词法作用域下如何拥有两个不同的值?
有人可以说,好吧,我要在声明之前将b
用作function
,并在为其分配number
之后将其用作number
。
答案 0 :(得分:3)
您可以理解,代码执行分为两个阶段
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
它将新值分配给类型为b
的变量number
答案 1 :(得分:0)
据我所知,这些不是2种不同的引用。
内部,
function b(){/*Code Here*/}
被执行为var b = function(){/*Code Here*/}
因此,第一个typeof(b)
返回 function 。
执行var b = 88;
时,这基本上将88分配给 b 的现有引用。
因此,第二个typeof(b)
返回 number 。
答案 2 :(得分:0)
在这种情况下,起吊过程如下:
var b
,无需初始化function b
,它将覆盖var声明88
分配给变量b
因此该函数实际上被转换为以下内容的“逻辑等效项”:
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
}