JavaScript && var、let、const

157 阅读2分钟

var

用于声明一个函数范围或全局范围的变量

  • 声明的变量的作用域:
    • 声明在函数内部,是它当前的执行上下文及闭包(嵌套函数)
    • 声明在任何函数外部,是全局的
  • 特点:
    • 重复声明JavaScript变量不会抛出错误(即使在严格模式 (strict mode) 下)
    • 变量也不会丢失其值,直到调用其它的赋值操作
    • 将在任何代码执行前被创建,这被称为变量提升。
      • 这些变量的初始值为 undefined
      • 提升将影响变量声明,而不会影响其值的初始化。在运行到复制语句之前,变量的值始终为undefined
      bla = 2
      var bla;
      
      // 可以隐式地(implicitly)将以上代码理解为:
      
      var bla;
      bla = 2;
      

let

  • 声明变量不会提升到代码块顶部,即不存在变量提升。
console.log(val); // undefined
let val = 123;
  • 禁止重复声明同一变量
let val = 123, val = 234; //'val' has already been declared
  • for循环语句中()内部,即圆括号之内会建立一个隐藏的作用域,该作用域不属于for后边的{}中,并且只有for后边的{}产生的块作用域能够访问这个隐藏的作用域,这使循环中,绑定块作用域有了妙用

const

  • 声明常量,其值一旦被设定不能再被修改,否则会报错。但是虽然不允许修改绑定,但允许修改对象的值
const val = 123; val = 234; // Assignment to constant variable.
const obj = {a: 123}; obj = {}; // Assignment to constant variable.
const obj = {a: 123}; obj.a = 234; obj.b = 111; // 没有问题
  • 声明变量不会提升到代码块顶部,即不存在变量提升。
console.log(val); // undefined
cobst val = 123;
  • 禁止重复声明同一变量
const val = 123, val = 234; //'val' has already been declared

临时死区(Temporal Dead Zone, TDZ)

JS引擎,在扫描代码时发现变量声明时,遇到 let 和 const 声明,就会将声明放在TDZ中,访问TDZ中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中移除,然后访客访问。