ES6 let const var

146 阅读2分钟

var 全局变量 可以重复赋值 有变量提升

let 只在块级作用域有效 不可重复赋值 无变量提升

const 只在块级作用域有效 只读变量 常量值不能改变

var a = 1
let b = 2
const c = 3

function test() {
  a = 11
  b = 22
  // c = 33 //报错
  console.log(a, b, c) //11,22,3     const常量不能二次赋值
}
test()

if (true) {
  console.log(aa); //bb报错  cc报错  只有var 存在变量提升
  var aa = 11
  let bb = 22
  const cc = 33
}
console.log(aa); //bb报错  cc报错   let const 只在块级作用域起作用

1.let const var

1.1var声明的变量会挂载在window上,而let和const声明的变量不会

var a = 100;
console.log(a,window.a);    // 100 100

let b = 10;
console.log(b,window.b);    // 10 undefined

const c = 1;
console.log(c,window.c);    // 1 undefined
var a = 100;
console.log(a,window.a);    // 100 100

let b = 10;
console.log(b,window.b);    // 10 undefined

const c = 1;
console.log(c,window.c);    // 1 undefined

2.2var声明变量存在变量提升,let和const不存在变量提升

console.log(a); // undefined  ===>  a已声明还没赋值,默认得到undefined值
var a = 100;

console.log(b); // 报错:b is not defined  ===> 找不到b这个变量
let b = 10;

console.log(c); // 报错:c is not defined  ===> 找不到c这个变量
const c = 10;

3.3let和const声明形成块作用域

if(1){
    var a = 100;
    let b = 10;
}

console.log(a); // 100
console.log(b)  // 报错:b is not defined  ===> 找不到b这个变量

if(1){

    var a = 100;
        
    const c = 1;
}
 console.log(a); // 100
 console.log(c)  // 报错:c is not defined  ===> 找不到c这个变量

3.4同一作用域下let和const不能声明同名变量,而var可以

var a = 100;
console.log(a); // 100

var a = 10;
console.log(a); // 10
let a = 100;
let a = 10;

//  控制台报错:Identifier 'a' has already been declared  ===> 标识符a已经被声明了。

3.5let和const存在暂存性死区

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}