ES5 只有2种声明对象的方式 var function
ES6 有6种声明对象的方式 let 、const、 import、 class、 var、 function
新增let ,类似var ,但只能在定义let的那个代码块可以使用
let 在循环语句里使用,可以只在该循环中被使用;并且,在for循环中,定义循环语句使用let 所定义的变量 与在循环语句内部属于两个变量域.

  1. for (let index = 0 ;index<3 ;index++){ //父级作用域
  2. let index="aaa" //子级作用域
  3. console.log(index)
  4. }

变量提升问题

使用var 定义的变量存在变量提升问题,即在定义前可以使用该变量,输出为undefined
而使用let 定义的变量,必须在定义之后才能使用 暂时性死区

  1. console.log(a) //undefined
  2. var a=1
  3. console.log(a) //报错
  4. let a = 1

块级作用域

块级作用域中定义的函数类似于let ,只能在该作用域中使用
浏览器环境差异问题,不要在块级作用域中使用函数声明,改写成函数表达式

  1. { 不要使用该方式
  2. function a(){
  3. }
  4. }
  5. { //使用函数表达式
  6. let a = function(){
  7. }
  8. }

const

声明只读的常量,声明了就无法更改
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动

  1. const number =[]
  2. number.push('nihao')//不会报错
  3. number =['nihao'] //会报错

如果像保证对象、数组不可修改,可以采用冻结的方式
const foo = Object.freeze({});

顶层对象的属性

var、function 声明的全局变量,依旧是顶层对象的属性 ,而let、const、class声明的全局变量,不在是顶层对象的属性

  1. var a =1
  2. window.a //1
  3. let b =1
  4. window.b //undefined