「前端每日一问(45)」什么是变量提升和暂时性死区?

321 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

本题类型:JavaScript

本题难度:⭐

答:

变量提升

变量提升是指在 JS 中,var 声明的变量和函数声明会提升到当前作用域的最顶部。

变量被提升后,会给变量设置默认值 undefined, 在变量赋值之前访问变量不会报错。

console.log(foo) // 输出 undefined
var foo = 'a'


上面代码等价于

var foo = undefined
console.log(foo) // 输出 undefined
foo = 'a'

至于函数的提升,就可以实现先执行函数,再定义,也不会报错。

foo() // 输出 123

function foo () {
  console.log(123)
}

暂时性死区

暂时性死区是 ES6 后,有了块级作用域才有的概念,就是因为变量提升会造成程序中代码令人费解的问题,才有了暂时性死区。

暂时性死区是指在块级作用域中,在代码块开始位置到声明变量的位置,这一块区域不能访问这个变量,否则就会报错,如下面示例所示:

if (true) {
  console.log(name)
  let name = 'lin'
}

image.png

把暂时性死区的区域画出来,如下图所示:

image.png

我们知道,函数可以用表达式来声明,如果用 let 来声明一个函数,还可以先执行,再声明吗?

a()

let a = function () {
  console.log(123)
}

答案是不能,会因为暂时性死区报错。

image.png

不只是块级作用域,在特殊情况下,函数参数默认值也会受到暂时性死区影响:

function fn (x = y, y) {
  console.log(x, y)
}

fn(undefined,2)

在上面的 fn 函数中,第一个参数设置默认值为第二个参数,如果第一个参数传占位符 undefined,就会报错,执行 x = y 会被当作暂时性死区处理。

image.png

结尾

关于 var、let 和 const 的区别,可以看我的这篇文章:

「前端每日一问(21)」说一下 var、let 和 const 的区别

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

你也可以关注《前端每日一问》这个专栏,防止失联哦~

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(44)」用过空值合并运算符 (??)吗?

下一篇:

「前端每日一问(46)」随便打开一个网站,统计这个网站用过的标签总数