有人可以帮助解释为什么下面的两个代码片段打印出不同的结果吗?
区别在于条件语句内部。第一个例子中,有一个局部变量“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(使用前将#替换为@)