gpt4 book ai didi

javascript - 吊装和可变范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:42:35 25 4
gpt4 key购买 nike

谁能帮忙解释一下为什么下面的两段代码打印出不同的结果?

区别在于条件语句。首先,将局部变量“Jack”赋值给 name,条件为真(意思是 !name 的计算结果为真)。在第二个中,相同的名称 'Jack' 被分配给全局变量名称,但条件是假的(!名称是假的)。我的问题是,如果其他一切都相同,那么如果更改的是条件体中,为什么第一个条件为真而第二个为假?

我唯一的解释是,条件语句的主体首先被JS解释器读取,这就是它如何确定name是全局的还是局部的,变量是否是否需要挂起声明,最后记录不同的名称值。

难道不应该在开始解释它的主体之前先评估条件 bool 值吗?然后在这两种情况下,变量“名称”将被评估为“未定义”...任何帮助将不胜感激!

有一些关于提升/范围上下文的非常好的资源,但我没有找到专门回答这个问题的资源。

http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/

var name = "Paul"; 
function users () {
if (!name) {
var name = "Jack"; //<== difference is here, *inside* conditional body
}
console.log(name);
}
users(); //outputs "Jack"

对比

var name = "Paul"; 
function users () {
if (!name) {
name = "Jack"; //<== difference is here, *inside* conditional body
}
console.log(name);
}
users(); //outputs "Paul"

最佳答案

变量声明提升到执行上下文的顶部,在本例中是函数用户。重写这些以显示从提升的 Angular 来看它的外观通常会消除任何混淆

var name = "Paul"; 
function users () {
var name;//<- hoisted variable declaration
if (!name) {
name = "Jack";
}
console.log(name);
}
users(); //outputs "Jack"

对比

var name = "Paul"; 
function users () {
if (!name) {//no hoisted variable declaration, uses global
name = "Jack";
}
console.log(name);
}
users(); //outputs "Paul"

执行上下文包含几个关键组件,这里最相关的是词法环境和变量环境。如果您在这里感兴趣,我将更深入地介绍两者之间的差异(以及一些简短的历史):https://stackoverflow.com/a/32573386/1026459

关于javascript - 吊装和可变范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37287609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com