你能澄清一下这个JavaScript变量提升行为吗?

时间:2016-05-29 10:34:12

标签: javascript hoisting

情况1:

var text = 'outside';
function logIt(){
    console.log(text);
    text ='inside';
}
logIt(); //prints outside. why?

我认为函数text中的logIt()将被提升到函数的顶部并打印undefined

情况2:

var text = 'outside';
function logIt(){
    console.log(text);
    var text ='inside';
}
logIt(); //prints undefined

此按预期打印undefined。有人可以在case1中解释为什么我们得到的值outside

3 个答案:

答案 0 :(得分:2)

由于提升内部变量text被移动到函数的开头。但只有它的名字部分:

var text = 'outside';
function logIt(){
    var text;
    console.log(text);
    text ='inside';
}
logIt(); //prints undefined

案例1记录"在"之外,因为textlogIt周围范围内的变量,因此可以在logIt内访问。您在text电话后以词汇方式重新分配console.log。所以这个重新考虑是不会被考虑的。

答案 1 :(得分:2)

变量声明被提升,而不是作业。

在第一个功能中,您只需在调用text后覆盖console.log 的值,但不会引入其他text到功能的本地范围。

在第二种情况下, 引入了一个新的text变量,该变量是本地的(并按预期初始化为undefined),并且由于变量提升,实际var text行在调用console.log之前解释,因此undefined

请参阅MDN

答案 2 :(得分:1)

吊装:你可以理解它,因为整个函数体是在脚本的顶部和变量一起获取的 具有未定义的值(如果在完成赋值之前使用它们)

现在案例1:

当您调用该函数并且console.log执行时,文本的值仍然是"在"

之外

在控制台记录之后,它将值更改为"在"

如果在调用logIt()后立即编写console.log,它将显示" inside"然后

var text = 'outside';
function logIt(){
    console.log(text);
    text ='inside';
}
logIt(); //prints outside. why?

案例2:在这种情况下,您在函数logIt中创建一个新的var,然后将其作为提升 var text = undefined(在分配之前使用它)

var text = 'outside';
function logIt(){
    console.log(text);
    var text ='inside';
}
logIt(); //prints undefined

这次调用函数后尝试打印console.log(text)。在这种情况下,它会在外面打印,因为全局范围没有效果,因为在这种情况下logIt函数"