具有相同变量名称的内部函数提升

时间:2019-08-16 14:51:50

标签: javascript

所以我以为我了解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
}

那么这是怎么回事?

6 个答案:

答案 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与提升无关。