系统运维

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

时间:2010-12-5 17:23:32  作者:人工智能   来源:IT科技  查看:  评论:0
内容摘要:在执行JavaScript代码之前,js引擎首先会对其进行解析和编译。在编译阶段,变量和函数声明被放入内存,这被称为提升(hoisting)。需要注意的是,声明只是被提升,而不是被初始化,这意味着如果

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

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

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做同样的事情会导致一个清晰的、易于调试的错误。

总结

在使用变量、函数、对象和类之前,务必要先定义它们。ESLint 可能可以帮你解决这个问题。 在项目中要尽可能的使用 const 和 let,而不是 var 。这样可以减少很多麻烦。 如果可能的话,只使用箭头函数或 function 声明。一致性有助于减少混乱。源码库
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap