【问题标题】:Are vars in a function scope hoisted to the beginning like vars in the global scope?函数范围内的 vars 是否像全局范围内的 vars 一样被提升到开头?
【发布时间】:2019-03-15 13:29:31
【问题描述】:

我找不到明确的答案,所以我会在这里尝试。

编辑:这个问题不是关于 var 是否可以从它所在范围的开头使用,而是我想知道是否在声明全局 var 时声明了 var,或者何时声明了函数调用。

考虑这个例子:

var a = "foo";
function xyz(){
    var b = "bar";
}
xyz();

当我运行这段代码时,var b 会被提升到哪里?

会不会:

declare function xyz
declare var a
assign value "foo" to var a
execute xyz()
>> declare var b
assign value "bar" to var b

或者会是:

declare function xyz
declare var a
>> declare var b
assign value "foo" to var a
execute xyz()
assign value "bar" to var b

我知道无法从全局范围访问 var b,但我很好奇这里发生的事情的顺序。

提前致谢

【问题讨论】:

  • 声明在运行时不做任何事情,那么你的问题是什么意思呢?
  • 我想知道 var b 的声明是在 var a 的声明之后发生在提升之后,还是会在执行 xyz() 时声明
  • 据我了解,JS 的执行与 JavaScript 引擎非常相关(因为某些引擎会编译一些代码),所以这取决于您使用的引擎。
  • 副本包含其工作原理的确切说明,包括对规范的引用。

标签: javascript hoisting


【解决方案1】:

变量b在你执行xyz()时被初始化,在解释过程中它没有被初始化。

function host() {
  var b;
}
var a;

var aIsDeclared = true; 
var bIsDeclared = true; 

try{ a; }
catch(e) {
    if(e.name == "ReferenceError") {
        aIsDeclared = false;
    }
}

try{ b; }
catch(e) {
    if(e.name == "ReferenceError") {
        bIsDeclared = false;
    }
}

console.log("a is declared : ", aIsDeclared)
console.log("b is declared : ", bIsDeclared)

【讨论】:

  • 你可能有这个来源吗?到目前为止,我阅读的所有关于吊装的文章都没有具体说明,我很想了解更多信息:)
  • @SHRX 我给你做一个现场演示,这样你可以看到如果你不调用函数,变量声明不起作用。所以在解释过程中没有声明变量。
  • 哦,太好了,但我认为没有必要,您的评论清楚地告诉我如何自己测试。非常感谢:)
猜你喜欢
  • 2012-02-18
  • 2017-01-20
  • 1970-01-01
  • 2013-07-13
  • 2022-08-11
  • 2021-04-30
  • 2021-01-01
  • 2011-09-14
  • 2019-01-25
相关资源
最近更新 更多