ECMAScript 6.0的新特效浅谈

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上

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190819A052HT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券