let 和 const
-
块级作用域
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6块级作用域一定要有大括号作为表示:
// 报错,不能在单行语句中定义 if (true) let x = 1; -
没有变量提升
var在声明前也可以使用let在声明前不允许使用变量或再次的声明
// var 的情况 console.log(foo); // undefined var foo = 2; // let 的情况 console.log(bar); // ReferenceError let bar = 2; -
暂时性死区
从块级作用域的开始到
let声明前变量都是不可用的var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } -
块级作用域可以直接创建,以及嵌套
{ {let insane = 'Hello World'} console.log(insane); // 报错 } -
函数声明
- ES5 中,函数只能在函数作用域(包括全局)中,行为类似
var - ES6 中,函数可以在块级作用域中定义,但如果声明成功则会提升
function f(flag) { if (flag) { function f() { console.log('true') } } f() } f(true) // true f(false) // 报错,没有这个函数应当避免在块级作用域内声明函数,或者可以用函数表达式代替
- ES5 中,函数只能在函数作用域(包括全局)中,行为类似
-
const- 声明的时候就应当初始化,一旦初始化,后续的修改将会报错
const拥有和let差不多的性质const保存的是指向实际数据的指针,可以改变数据对象,但不可以改变引用- 如果想完全冻结对象,使用
Object.freeze(data)方法
-
ES6 六种方法声明变量
- ES5:
varfunction letconstimportclass
- ES5: