面试取经:js篇-变量声明三兄弟

32 阅读1分钟
  • var
  • let
  • const

var

最早声明变量的方式,但存在两个问题

声明提升

 console.log(a); // undefined
  var a = 1;
  
  // 实际
  var a;
  console.log(a);
  a = 1;
  

作用域污染

  // 全局作用域
  var a = 1;
  function m(){
      // 函数作用域
      a = 2
  }
  m()
  console.log(a) // 2

作用域

作用域包括全局作用域、函数作用域,es6新增了块级作用域({},if块,for块)

{
    let a = 1;
}
console.log(a) // error a is not defined

var 的特性

  • 没有块作用域的概念
{
    var a = 1;
}
console.log(a) // 1
  • 有全局作用域、函数作用域的概念
  • 不初始化,默认值为undefined
  • 存在变量提升
  • 全局作用域var声明的变量会挂载到window对象下
  • 同一作用域允许重复声明

let

let、const 解决了var之前存在的问题,let一般用于声明可变变量(开发中优先使用const进行声明,const不可用的情况下用let)

let 特性

  • 有块级作用域的概念
{
    let a = 1;
}
console.log(a) // error a is not defined
  • 不存在变量提升
{
    console.log(a) // cannot access 'a' before initialization
    let a = 1;
}
  • 暂时性死区

在词法环境中无法在变量声明之前,访问该变量

  • 同一作用域不允许重复声明

const

用于声明常量,推荐使用

const LIMIT = 100;
const obj = {
    a:1
}
​
const test = ()={
    //
}

const 特性

  • 必须立即初始化
const a;// missing initializer in const delcaration
  • 常量声明不支持修改
  • 其他特性与let一致