<返回更多

JavaScript 中的“提升”是怎么回事?

2021-06-23  前端先锋  前端小混混
加入收藏

作者:前端小混混 来源:前端先锋

在执行JAVAScript代码之前,js引擎首先会对其进行解析和编译。在编译阶段,变量和函数声明被放入内存,这被称为提升(hoisting)。

需要注意的是,声明只是被提升,而不是被初始化,这意味着如果一个变量在使用后被声明并初始化,则不会初始化它的值。

JavaScript 中的“提升”是怎么回事?

 

function

使用 function 声明时,可以在定义之前调用这个函数,它会按预期正常工作。例如:

hello(); // 输出 'Hello world!' 
 
function hello() { 
  console.log('Hello world!'); 
} 
 
hello(); // 输出 'Hello world!' 

在上面的例子中, function 声明被提升到其作用域的顶部,并且由于函数声明的性质,在声明之前就可用。不过这是函数提升行为的唯一案例。

var

另一方面,var 声明的行为有所不同,在其初始化之前进行访问会返回 undefined。例如:

console.log(x); // 输出 'undefined' 
f(); // 抛出异常:'Uncaught TypeError: f is not a function' 
 
var x = 1; 
var f = () => 'Hi!'; 
 
console.log(x); // 输出 '1' 
f(); // 返回 'Hi!' 

正如你在这个例子中所看到的,var 声明被提升到它作用域的顶部,但是变量的值只有在初始化代码被执行时才会初始化,所以在初始化这行代码之前是 undefined。

const 和 let

const 和 let 声明被提升,但它们没有被初始化为 undefined。而是会给你一个错误,这也是 class 声明的行为方式。例如:

console.log(y); // 抛出异常: 'Uncaught ReferenceError: Cannot access "y" before initialization' 
g();  // 抛出异常: 'Uncaught ReferenceError: Cannot access "g" before initialization' 
 
let y = 2; 
const g = () => 'Hey!'; 
 
console.log(y); // 输出 '2' 
f(); // 返回 'Hey!' 

一般情况下,在初始化之前访问用 var 声明的变量会默默地失败,对 const 或 let做同样的事情会导致一个清晰的、易于调试的错误。

总结

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>