变量声明中let const 和 var 的区别

259 阅读2分钟

Var 是全局变量 let const是块级作用域,只在命令所在的代码块内有效

{{{{
  {let insane = 'Hello World'}
  console.log(insane); // 报错
}}}};
//上面代码使用了一个五层的块级作用域,每一层都是一个单独的作用域。第四层作用域无法读取第五层作用域的内部变量

块级作用域的出现,实际上使得获得广泛应用的匿名立即执行函数表达式(匿名 IIFE)不再必要了。

// IIFE 写法
(function () {
  var tmp = ...;
  ...
}());

// 块级作用域写法
{
  let tmp = ...;
  ...
}

let const日常使用应该注意的点

  • 没有变量提升
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // Uncaught ReferenceError: bar is not defined
let bar = 2;
//变量提升的争议: 错误原因:bar没有定义,如果说let bar不存在变量提升,那么在运行上面代码的也应该报出bar没有定义这个错误的,但是错误确是因为foo没有被初始化
//真相:**letconst定义的变量都会被提升,但是不会被初始化,不能被引用**,不会像var定义的变量那样,初始值为undefined。因此,在使用console.log(foo)的时候会发生引用错误。
//const的引用不应被改变。如果编译器把const初始化为undefined,之后,又让它等于我们定义的那个值,就改变了const的引用。因此,委员会决定letconst虽然也会发生变量提升,但是没有任何[初始值]
  • 不能重复声明
// 报错
function func() {
  let a = 10;
  var a = 1;
}

// 报错
function func() {
  let a = 10;
  let a = 1;
}
  • 暂时性死区
if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

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

  tmp = 123;
  console.log(tmp); // 123
}
//使用`let`命令声明变量之前,该变量都是不可用的,都属于变量`tmp`的“死区” ,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

cons 和 let 区别

-const声明一个只读的常量。一旦声明,常量的值就不能改变

let aa = 2
    aa = 3
console.log(aa) // 3

const bb = null
      bb = 3
console.log(bb) //  Assignment to constant variable
  • const 声明复合类型的数据,只能保证这个指针是固定的地址,但是它指向的数据结构是可变的,
const bb = { name: 'xm', age: 1 }
bb.name = 'xh'
console.log(bb) // 3

摘取阮一峰es6 进级的前端面试