Es6新特性?
一、let
1. 没有变量提升
console.log(a);
let a = 4;
// a is not defined
2. 不能重复申明
let a = 4;
let a = 5;
console.log(a);
// Identifier 'a' has already been declared
3. 临时失效区(暂时性死区)
var a = 5;
function fn(){
console.log(a);
let a = 4;
}
fn();
// a is not defined
4. 具有块级作用域(由花括号包裹的区域)
同样具有块级作用域的还有const。
来看一个例子
var a = 5;
function foo(){
console.log(a); // undefined
if(false){
var a = 6;
}
}
这显然不是我们想要的结果,因为
js在es6之前没有块级作用域
for(let i = 0; i
console.log(i);
}
console.log(i);
// 0 1 2 i is not defined
{
let a = 10;
}
console.log(a);
// a is not defined
老生常谈的闭包问题 实质上就是为了解决没有块级作用域带来的问题
闭包
* 外部函数(作用域)中有内部函数(作用域)
* 内部函数调用了外部函数的局部变量
* 外部函数执行完后,因为内部函数还在使用该局部变量,所以该局部变量不被释放,保证内部函数正常使用
* 闭包函数(立即执行函数)为
(function(){
// ...函数体
})();
var aLi = document.getElementsByTagName('li');// len = n
for(var i = 0; i
aLi[i].onclick = function(){
console.log(i);
}
}
// n......n
var aLi = document.getElementsByTagName('li');// len = n
for(var i = 0; i
(function(i){
aLi[i].onclick = function(){
console.log(i);
}
})(i)
}
// 0、1、2....n
for循环实质可以理解为 由n个”{}”构成的,在每个花括号中,let的作用域都是独立的,所以可以拿到每个i值。
但对于var来说实质是一个作用域,所以无法保留每个i的值。
二、const
在es6之前,如果我们想定义常量,通常由程序员自己约定
var NUM = 100;
将所有字母都大写的变量约定为常量,但本质还是变量
1.const定义只是地址不能修改
const NUM = 100;
NUM = 200;
// Assignment to constant variable.
由const定义的常量,无法修改其地址值。
在这里为啥要强调是地址值
因为 以下代码在非严格模式下是可以通过的
const OBJ = ;
OBJ.a = 200;
console.log(OBJ.A);
// 200
这时候会发现这很坑啊!!!
怎么办呢,如果我们想要定义一个常量对象呢
const OBJ = ;
Object.freeze(OBJ);
OBJ.a = 200;
console.log(OBJ.a);
// 100
这样就可以了..
2.没有变量提升
3.块级作用域
let 和 const 声明的变量不挂在window上
领取专属 10元无门槛券
私享最新 技术干货