所以我以为我了解JavaScript的吊装,直到看到这样的东西:
function hoist(a) {
console.log(a);
var a = 10;
}
hoist(5);
上面的代码输出5
,而不是undefined
!
据我了解,该函数在解释器中看起来像这样:
function hoist(a) {
var a; // This should overshadow the parameter 'a' and 'undefined' should be assigned to it
console.log(a); // so this should print undefined
a = 10; // now a is assigned 10
}
那么这是怎么回事?
答案 0 :(得分:6)
如果var被称为b
,但是var a
已经存在,那将是正确的。重新声明已经存在的javascript变量不会执行任何操作。它不会将值更改为undefined。试试吧。
function hoist(a) {
var a; // no op, does not change a to undefined.
console.log(a);
a = 10;
}
hoist(18);
答案 1 :(得分:2)
这属于MDN的Only declarations are hoisted部分(至少是链接一些文档)。
给出的第二个示例正是您要查找的示例:
num = 6;
console.log(num); // returns 6
var num; // or, really, var num = whatever.
回想一下刚才所说的话:
如果在使用变量后声明,但事先对其进行了初始化,它将返回该值。
答案 2 :(得分:1)
提升变量意味着编译器从块的开头就知道变量名称。它不会重新引入,覆盖,清除或重置变量(如果已存在)。
在分配某些内容之前,该变量的值为undefined
,但提升本身对变量的值不起任何作用。
碰巧的是,函数参数也是的一种声明变量的方式,例如不可见的var
语句,然后是在调用函数之前发生的赋值实际功能主体的执行。
答案 3 :(得分:0)
起吊仍按预期运行,因为我们可以看到以下代码段也输出5:
function hoist(a) {
var a;
console.log(a);
a = 10;
}
hoist(5);
我们在这里真正拥有的是一个函数参数a,该函数参数在函数的值已被初始化为5的函数中重新声明。
答案 4 :(得分:0)
您是正确的,在该功能内可以通过这种方式进行吊装。
在此特定示例中,我们将参数/参数传递给函数,并更改了其解释方式。看看吧:
function hoist(a) { // here's our 'a' parameter gets replaced by '5' that we passed while execution of this function
var a; // with no new value it does nothing
console.log(a); // so this will print 5 that we passed to this function
a = 10; // now a is assigned 10 and next console.log() would show a new value of 'a' variable
}
答案 5 :(得分:-1)
吊装与在声明函数之前调用函数有关,因为javascript会将函数声明推到顶部。在这种情况下,参数a
和变量a
与提升无关。