Javascript 函数范围混淆

Javascript Function Scope Confusion

提问人:webbyweb 提问时间:6/18/2018 更新时间:5/21/2020 访问量:88

问:

有人可以向我解释一下吗:

var test = 5;

// prints 5;
function printMe1(){
    console.log(test);
}

// prints "undefined"
function printMe2(){
    console.log(test);
    var test = 10;
}

这是因为 printMe2 创建了一个局部变量 “test” 吗?如果是这样,为什么 log 语句引用局部变量,如果它是在它之后声明的?

而且,如果 JS 是一种解释型语言,那么代码不应该逐行解释吗?在哪种情况下,log 语句不应该知道稍后声明了本地“test”变量?

JavaScript 函数 作用域

评论

1赞 ASDFGerte 6/18/2018
可变起重
1赞 Ry- 6/18/2018
JS 不是逐行解释的。除此之外的“解释”区别并不是很重要。当涉及到范围时,在哪里声明变量并不重要;如果它在该作用域中的某个位置声明,则它是其作用域中其名称的目标。使用 和 , 从不 ,以获得关于此的正确错误。letconstvar
0赞 Jonathan 6/18/2018
这里和网上已经有大量关于 JS 范围界定的答案。同时搜索“吊装”
0赞 ASDFGerte 6/18/2018
@Jonathan我发现了很多答案,但没有一个用于重复标志的规范答案。当然,对于数百个关于这个问题的问题中的任何一个,我都可以将其标记为重复,但是我正在搜索一个“受保护的大帖子”来解释这一点,但还没有找到任何内容。
0赞 Bergi 6/18/2018
"如果JS是一种解释型语言,那么代码不应该逐行解释吗?- 不,这根本不是“解释”的意思

答:

0赞 webbyweb 6/18/2018 #1

我只是做了一些谷歌搜索并找到了答案。

这是因为 Javascript 将变量声明“提升”到作用域的顶部。因此,局部“test”变量被声明在函数作用域的顶部,因此打印它给出“undefined”的原因。

(如果有任何错误,请告诉我:))

评论

1赞 Dave Newton 6/18/2018
很高兴你在自己身上找到了答案——尽管下次可能会先试试;)
1赞 anuj agarwal 5/21/2020 #2

JavaScript 中有一个概念“提升”,因此在提升中,变量和函数声明在代码执行之前被移动到其作用域的顶部。只记住声明,不记住定义。这就是为什么在您的代码中 var test 显示 undefined,因为您在定义它之前使用了这个变量。

var test;
function printme2(){
console.log(test)
test=10
}
printme2()