关于JS变量提升以及暂时性死域的理解

本文根据我自身的理解来写作的文章。如有错误,欢迎指正。

在js中有三种申明变量的方式 分别是 var let const 而其中 var 是能被变量提升的。 而let和const是无法被变量提升的。

  1. 变量提升

可以看到第一行 使用 var申明的o1 在初始化之前就能够被console.log打印出来 而使用let申明的b1 却无法在变量被初始化前打印 并且直接报错。 这就是因为let是没有被提升到作用域的顶部导致的

  1. 暂时性死域

再看第一行打印的 o1 是undefined而不是 123 这是因为虽然变量被提升到作用域的顶部了 但是此时变量是还未被初始化的 所以打印出来的才会是 undefined 而在变量提升 到变量初始化的这片区域 就被称为变量的暂时性死域

  1. 函数提升

既然变量能被提升 那么函数是否能被提升呢?

答案是:可以的。

可以看到 通过 function 关键字的函数申明式的 func1 是能够被正常执行的 而通过字面量形式(即使用变量)的无法被执行。所以 直接使用function申明的函数 是会被js提升的 而使用变量字面量形式申明的 其实和上方所说的变量提升及暂时性死域是一样的 let和const无法被提升 所以使用这两个申明的函数 在初始化前调用的话 会爆出 "[functionName] is not defined"而 使用 var 申明的函数 在初始化之前是 undefined 而 undefined 无法作为一个函数来调用 所以会爆出 "[functionName] is not a function"

  1. 最后

本文是根据作者自己的理解而写作的 如有错误 欢迎指正 本文仅做个人随笔 更多详情请自行查找