保留了var和function。新增加了let、const、class和import。而且,let、const、class声明的全局变量再也不会和全局对象的属性挂钩了。
let定义变量 const定义常量
let定义变量
1.块级作用域
2.let不会发生变量提升
3.暂时性死区
4.不允许重复定义
优势:
一、内存变量可能会覆盖外层变量
二、用来计数的循环变量泄露为全局变量
1.块级作用域
for(let i = 0; i < 10; i++){
console.log(i)
}
i //会报错undefined
2.let不会发生变量提升
3.暂时性死区
var a = if(true){
console.log(a) //ReferenceError let a = 2
}
4.不允许重复定义
function () {
let a = 10;
let a = 1;// 报错
}
const定义常量
1.const声明只读的常量,且不可改变,因此不能只声明不赋值。
2.跟let类似是块级作用域,存在暂时性死区。
3.对于复合类型的变量,定义变量
const a = 123
a = 456 //报错
const b //报错
var aa = 'hello'
if(true){
console.log(aa) //报错
const aa = 123
}
console.log(aa) // 'hello'
ES6的块级作用域
一、es6允许块级作用域任意嵌套
{{{{
{
let insane = 'Hello World'
}
console.log(insane); // 报错
}}}};
二、取代立即执行匿名函数
// IIFE写法
(function () {
var tmp = 123}()
);
// 块级作用域写法
{
let tmp = 123
}
三、在块级作用域中定义函数
在es5严格模式下 ‘use static’下 块级定义函数会报错
(function(){
a = 3
})()
var b = 2
console.log(window.a, window.b) //打印3,2,全局变量自动成为全局对象的属性
let c = 123
const d = 456
console.log(window.c, window.d) //undefined*2, es6的属性将与全局对象脱钩