【发布时间】:2016-09-14 05:33:34
【问题描述】:
有人能帮忙解释一下为什么下面的两个 sn-ps 代码会打印出不同的结果吗?
区别在于条件语句。首先,将局部变量“Jack”赋值给 name,条件为真(意思是 !name 的计算结果为真)。在第二个中,将相同的名称“Jack”分配给全局变量名称,但条件是假的(!name 是假的)。我的问题是,如果所有其他条件都相同,为什么第一个条件为真而第二个条件为假,如果改变的是 inside 条件体?
我唯一的解释是,条件的主体是由JS解释器首先读取的,它是如何判断name是全局/局部的,变量声明是否需要吊装与否,最后,记录了不同的名称值。
不应该在开始解释它的主体之前先评估条件布尔值吗?然后在这两种情况下,变量“名称”将被评估为“未定义”......任何帮助将不胜感激!
有一些关于提升/范围上下文的非常好的资源,但我没有找到专门回答这个问题的资源。
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"
【问题讨论】:
-
在一种情况下有一个局部变量,在另一种情况下没有。为什么结果会一样?
-
@Bergi 如果提升的变量声明没有改变条件的逻辑,则返回值将是相同的。
-
“不应该在这两种情况下都将变量 'name' 评估为 'undefined'” 哦不?在第二个示例中,
name不是局部变量。它指的是具有值"Paul"的全局变量。提升仅适用于变量声明。第二个例子的函数内部没有变量声明, -
@Felix King:是的,在这种情况下,我知道全局变量和局部变量之间的区别。我知道将
var放在变量前面会创建一个局部变量。我知道声明name = 'Jeff'会改变全局变量。我实际上感到困惑的部分是,为什么在条件if (!name)甚至被评估之前,这些内部语句甚至首先被评估。如果我问一个更有针对性的问题,也许会有所帮助。在条件语句(无论是真还是假)内声明的变量是否被提升到顶部? -
这个问题似乎与您帖子中的问题不同(您想知道为什么 both 不是
undefined)。无论如何,是的,var声明的作用域是函数。
标签: javascript variables scope hoisting