ES6个人学习-变量声明

ES5中,使用var(variable简写)定义全局变量

ES6中,新增let和const来定义变量:let定义局部变量,const定义常量(定义后不可修改)

总结:用var全部定义的变量,有时会污染js的作用域。现在基本都是用ES6,尽量避免使用var定义变量。

用 let 声明的变量,只在局部(块级作用域内)起作用。

let 和 const 的特点【重要】

  • 不存在变量提升

  • 禁止重复声明

  • 支持块级作用域

  • 暂时性死区

相反, 用var声明的变量:存在变量提升、可以重复声明、没有块级作用域。

var/let/const 的共同点:
全局作用域中定义的变量,可以在函数中使用。

函数中声明的变量,只能在函数及其子函数中使用,外部无法使用。

暂时性死区:

var temp = 123;
if (true) {
   temp = 'abc'; // ReferenceError
   let temp;
}

声明了全局变量temp,但是块级作用域内let又声明了一个局部变量temp,导致let绑定这个块级作用域,所以在let声明变量前,对temp赋值会报错。

ES6明确规定:如使用 let/const 声明的变量,会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。

也就是说,在使用 let/const 声明变量时,变量需要先声明,再使用(声明语句必须放在使用之前)。这在语法上,称为 “暂时性死区”( temporal dead zone,简称 TDZ)。

if (true) {
  // TDZ开始
  temp = 'abc'; // ReferenceError
  console.log(temp); // ReferenceError

  let temp; // TDZ结束
  console.log(temp); // undefined

  temp = 123;
  console.log(temp); // 123
}

在let声明变量temp之前,都属于变量temp的“死区”,赋值给temp会直接报错。

posted @ 2020-12-04 10:28  小安不菜  阅读(99)  评论(0)    收藏  举报