提升和变量范围

2024-02-01

有人可以帮助解释为什么下面的两个代码片段打印出不同的结果吗?

区别在于条件语句内部。第一个例子中,有一个局部变量“Jack”分配给 name,并且条件为 true(意味着 !name 的计算结果为 true)。在第二个例子中,相同的名称“Jack”被分配给全局变量名称,但条件为假(!名称为假)。我的问题是,如果其他条件都相同,为什么第一个条件为真,而第二个条件为假,如果更改的是inside有条件的身体?

我唯一的解释是条件体是由 JS 解释器读取的first,这就是它如何确定是否name是全局/局部,变量声明是否需要提升,最后记录不同的名称值。

在开始解释其主体之前,是否应该首先评估条件布尔值?那么在这两种情况下,变量“名称”将被评估为“未定义”...任何帮助将不胜感激!

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

http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/ 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"

vs.

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

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

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

vs.

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 https://stackoverflow.com/a/32573386/1026459

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提升和变量范围 的相关文章

随机推荐