疯狂的技术宅

以前出于工作目的,编写和翻译了大量的技术文章,以前端为主,删掉了过时的、毫无营养的内容,留下的都是精华。


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于本站

  • 回到主站

  • 搜索

JavaScript 中的提升是什么?

时间: 2021-06-02 分类: 前端技术   字数: 678 字 阅读: 2分钟
标签: #JavaScript# #提升# #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 声明。 一致性有助于减少混乱。
标签: #JavaScript# #提升# #hoisting#

标题:JavaScript 中的提升是什么?

链接:https://fe-tech.viewnode.com/post/202106/02/

作者:疯狂的技术宅

声明: 本博客文章除特别声明外,均采用 CC BY-NC-ND 4.0 国际许可协议( 知识共享署名-非商业性使用-禁止演绎 4.0),转载请注明出处!

什么情况下可以使用 JavaScript 中的 Boolean 函数
创建你自己的 vue 自定义指令
  • 文章目录
  • 站点概览
疯狂的技术宅

疯狂的技术宅

退休程序员,硬件发烧友,人工智能爱好者。写写代码喝喝茶,晒晒太阳带带娃。

457 日志
8 分类
583 标签
GitHub
友情链接
  • viewnode
  • mofish
标签云
  • Javascript 172
  • Node.Js 62
  • Vue 36
  • Typescript 28
  • 实战项目 28
  • 面试 21
  • React 20
  • Css 17
  • 面试题 16
  • 教程 13
  • Promise 12
  • Chrome 9
  • Debug 9
  • 调试 9
  • 资源 9
  • Deno 8
  • Dom 8
  • 杂谈 8
  • 正则表达式 8
  • 测试 8
    • function
    • var
    • const 和 let
    • 总结
© 2018 - 2022 疯狂的技术宅 All Rights Reserved
Powered by - Hugo v0.99.0 / Theme by - NexT
Storage by 俺的服务器 / 冀ICP备2022010157号
0%