Visual LabINTERACTIVE LEARNING
JavaScript 内核第 3 / 7 章

作用域与暂时性死区

区分词法作用域、声明提升与暂时性死区。

this原型异步
进阶预计 65 分钟查看源文 ↗

作用域相关

作用域提升

🌅 提示

变量声明前能被访问,叫作用域提升

  • Var 有
  • Let/const 没有,且变量不能重复被声明,即前面已被var/const/let/函数参数 声明过的变量都不能被再次声明
var message = "message";

function foo(m) {
  console.log('m', m)
  const m = 'm' //报错
  // let m = 'm' //报错
  console.log('m', m)

}
foo(message)

暂时性死区(TDZ)

💡 提示

const / let 没有作用域提升的实现原理,就是暂时性死区

一个作用域内,在声明message之前的区域,成为暂时性死区,这时访问message会报错,这个例子虽然上层作用域有message,但是当前的作用域内已经声明了message,所以不会访问外部的message

 const message = '123'
 
 function foo(){
   console.log(message) //error
   const message='456'
 }

作用域

  1. ES6之前,js只有全局作用域和函数作用域,也就是if/for等代码块里没有作用域,也就是说外层if/for里面使用var定义的变量会被挂在window上
if(true){
  var test = 'test'
  function foo(){
    console.log('foo')
  }
}
// 这里的test会被挂在到window上去
// foo在if代码执行后才能访问,在之前不行,不是作用域提升
  1. ES6之后,新增了块级作用域,if/for 存在作用域

🏕️ 提示

注意: 顶层作用域下的 单纯的代码块 ,内部var定义的变量/函数 仍然能被外层访问,这是对低版本js的兼容 但是也只能在 代码块之后被访问到,而不是作用域提升,var定义的变量仍会挂到window上 const/let 定义的变量仍然不能被外层访问到