是否在变量声明之前先悬挂了函数声明?

时间:2018-12-20 20:17:59

标签: javascript hoisting

我试图理解Java语言中的变量提升,特别是函数声明和变量声明的提升顺序。据我了解,函数声明首先被悬挂,其次是变量声明。

以下两个代码段让我认为在某些情况下变量声明必须在函数声明之前:

bar();
function bar() {
  console.log(foo);
}
var foo; 

// The console will log: undefined

bar();
function bar() {
    console.log(undeclaredVariable);
}
/* As expected, the above throws:
 * "ReferenceError:  undeclaredVariable is not defined"
*/
  

在两种情况下,函数bar都将被吊起,因此我可以在第一行中立即调用它。但是,如果将诸如foo之类的变量悬挂在函数之后,则console.log(foo)也不应像在第二个片断中ReferenceError一样在第一个片断中抛出一个console.log(undeclaredVariable),因为那样还没有宣布吗?关于Javascript处理变量声明和提升的方式,实际顺序是什么?

2 个答案:

答案 0 :(得分:1)

函数和变量声明(但不赋值)都被吊起。

因此在此示例中:

bar();
function bar() {
  console.log(foo);
}
var foo; 

同时悬挂函数声明和变量声明,然后执行类似bar();的代码。

在对代码进行JIT编译时会发生提升,而代码在编译后实际上就会执行。

答案 1 :(得分:1)

否,它不会引发错误,因为在调用bar()之前不会评估该函数。顺序无关紧要:这两个都不会引发错误:

var foo; 
function bar() {
  console.log(foo);
}
bar();

function bar() {
  console.log(foo);
}
var foo; 
bar();

因为不管起吊顺序如何,在调用bar()并执行函数之前都要声明名称。