ES6 let、const

210 阅读2分钟

let与const:

let

  1. 暂存死区(相当于预加载机制无法加载到的,即为暂存死区)
let monkey = '我是美猴王';
{
  console.log(monkey);  // 报错
  let monkey = '我觉得我还能再抢救一下!';
}
console.log(monkey); // 执行不到这里

由于let是块级作用域,第一次打印,对内申明前访问,自然访问不到,对外变量名冲突,也访问不到。

  1. 生成十个按钮 每个按钮点击的时候弹出1 - 10
// var 声明
var i = 0;
for (i = 1; i <= 10; i ++) {
  (function(i) { // 子执行匿名函数
    var btn = document.createElement('button');
    btn.innerText = i;
    btn.onclick = function() {
        alert(i)
    };
    document.body.appendChild(btn);
  })(i);
}
// let 声明
for (let i = 1; i <= 10; i ++) {
  var btn = document.createElement('button');
  btn.innerText = i;
  btn.onclick = function() {
    alert(i);
  };
  document.body.appendChild(btn);
}

let与var的区别:

  1. let声明的变量只在当前(块级)作用域内有效
  2. var声明的变量只在当前作用域内有效
  3. let声明的变量不能被重复声明
  4. let不存在变量提升(JavaScript中,函数及变量的声明都将被提升到函数的最顶部。 JavaScript中,变量可以在使用后声明,也就是变量可以先使用再声明)
  5. ES6之前的作用域:全局作用域、函数作用域、eval作用域

常量 const

  1. 常量声明:声明的时候必须要初始化(即赋值),否则会报错。
const a; // 报错
const aa = 1;
var b = 2;
let c; // undefinded
  1. 常量声明后不能被修改。
const NAME = '小明';
NAME = '小红';  //  NAME is not defined
  1. 常量为引用类型的时候 可以修改该引用类型
const xiaoming = {
  age: 14,
  name: '小明'
};
console.log(xiaoming);
xiaoming.age = 22;
console.log(xiaoming);
xiaoming = {};

第一次修改xiaomign的值成功,第二次不成功。因为const声明的常量其实相当于指向一个引用地址,修改该引用地址里面的值,该引用地址是不会发生任何改变,但是不能修改其指向的地址。这里第二次赋值一个新的对象字面量,相当于重新指向一个新的地址,故会报错。

  1. 怎么防止常量为引用类型的时候能被修改的情况 Object.freeze(对象名)
Object.freeze()
const xiaoming = {
  age: 14,
  name: '小明'
};
Object.freeze(xiaoming);
console.log(xiaoming);
xiaoming.age = 22;
xiaoming.dd = 11;
console.log(xiaoming);

修改前后值任然一样,说明未能被修改。

常量与变量

  1. 变量是可以改变的,常量声明必须赋值,但是不能重复声明。
  2. const 与 let:不能重复声明,不存在变量提升,只在当前(块级)作用域内有效

块级作用域

相当于就是一堆{...}中间区域,块级作用域可以嵌套

{
    // 我是块级作用域1
    {
        // 我是块级作用域2
    }
}

解构赋值