一起养成写作习惯!这是我参与「掘金日新计划 · 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'
}
把暂时性死区的区域画出来,如下图所示:
我们知道,函数可以用表达式来声明,如果用 let 来声明一个函数,还可以先执行,再声明吗?
a()
let a = function () {
console.log(123)
}
答案是不能,会因为暂时性死区报错。
不只是块级作用域,在特殊情况下,函数参数默认值也会受到暂时性死区影响:
function fn (x = y, y) {
console.log(x, y)
}
fn(undefined,2)
在上面的 fn 函数中,第一个参数设置默认值为第二个参数,如果第一个参数传占位符 undefined,就会报错,执行 x = y 会被当作暂时性死区处理。
结尾
关于 var、let 和 const 的区别,可以看我的这篇文章:
「前端每日一问(21)」说一下 var、let 和 const 的区别
阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~
如果我的文章对你有帮助,你的👍就是对我的最大支持^_^
你也可以关注《前端每日一问》这个专栏,防止失联哦~
我是阿林,输出洞见技术,再会!
上一篇:
下一篇: