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

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

创新互联主营枣庄网站建设的网络公司,主营网站建设方案,重庆App定制开发,枣庄h5重庆小程序开发公司搭建,枣庄网站营销推广欢迎枣庄等地区企业咨询

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

function

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

 
 
 
  1. hello(); // 输出 'Hello world!'
  2. function hello() {
  3.   console.log('Hello world!');
  4. }
  5. hello(); // 输出 'Hello world!'

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

var

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

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

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

const 和 let

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

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

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

总结

  • 在使用变量、函数、对象和类之前,务必要先定义它们。ESLint 可能可以帮你解决这个问题。
  • 在项目中要尽可能的使用 const 和 let,而不是 var 。这样可以减少很多麻烦。
  • 如果可能的话,只使用箭头函数或 function 声明。一致性有助于减少混乱。

名称栏目:JavaScript中的“提升”是怎么回事?
链接URL:http://www.csdahua.cn/qtweb/news48/501248.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网