ECMAScript6(ES6)标准之let、const关键字与块级作用域
2016-12-18 16:56
691 查看
隔了两周没有更新
今天开始整理ES6的知识
先来看看ES6增加的两个声明变量的关键字
let与const
传送门:理清JS中的词法、静态、动态、函数、块作用域
里面就谈到了块级作用域
在ES6之前
我们声明变量只能用var
并且作用域的机制是函数作用域(with关键字、catch子句是特例)
(C/C++的作用域模式是块作用域)
ES6新增的let与const就可以将变量绑定到所在的任意作用域中(一般是 {….} 内部)
也就是说,let、const为声明的变量隐式劫持了所在的块作用域
与函数作用域类似
“块”内可以使用“块”外的变量
“块”外不能使用“块”内的变量
下面再来接着看看let产生的块级作用域有什么特点和优点
首先最重要的一点就是
使用let声明 不会有提升行为
下面就是var和let的区别
既然let“劫持”了所在的块作用域
那么它声明的变量就会 统治所在块作用域
看这个例子
由于let的劫持,并没有打印1
而是报错a未定义
不仅如此,使用let 不能重复声明变量
使用ES6的let或者说使用块作用域的好处是什么呢
首先变量进一步被限制在“块”中,可以防止变量污染
其次就是防止闭包产生的问题
由于闭包的原因
控制台打印了10个10
为了得到0~9
我们以前的做法通常是加一个立即执行函数
这样通过增加中间函数作用域可以解决问题
但是let可以更好的解决
只需要把var换成let
这样每次迭代都会进行重新绑定的行为
const拥有let的全部特点
包括劫持块作用域、无提升行为、不能重复声明等等
但是它用来声明常量
一旦声明就不能更改
所以使用const声明必须直接初始化
关于const还有一点要注意
引用值之所以可以改变
是因为我们在内存上拿到的是引用值的地址
和我们C/C++中的指针是一样的
我们修改引用值不该变它的地址
所以const并不能限制我们修改引用值
let、const没有提升行为
let、const统治所在块作用域
let、const不能重复声明
let解决闭包产生的问题
const用于声明常量一旦声明不能更改
const必须直接初始化
const不能限制修改引用值
==主页传送门==
今天开始整理ES6的知识
先来看看ES6增加的两个声明变量的关键字
let与const
块级作用域
我以前就写过一篇文章介绍了作用域的分类传送门:理清JS中的词法、静态、动态、函数、块作用域
里面就谈到了块级作用域
在ES6之前
我们声明变量只能用var
并且作用域的机制是函数作用域(with关键字、catch子句是特例)
if(true){ var i = 1; } console.log(i); //输出:1
(function foo(){ var a = 1; })(); console.log(a); //报错:a is not defined
(C/C++的作用域模式是块作用域)
ES6新增的let与const就可以将变量绑定到所在的任意作用域中(一般是 {….} 内部)
也就是说,let、const为声明的变量隐式劫持了所在的块作用域
与函数作用域类似
“块”内可以使用“块”外的变量
“块”外不能使用“块”内的变量
{ var a = 1; let b = 2; } console.log(a); //1 console.log(b); //报错
let
上面我们复习了一下什么是块作用域下面再来接着看看let产生的块级作用域有什么特点和优点
首先最重要的一点就是
使用let声明 不会有提升行为
下面就是var和let的区别
{ console.log(a); //undefined var a = 1; }
{ console.log(a); let a = 1; //报错 }
既然let“劫持”了所在的块作用域
那么它声明的变量就会 统治所在块作用域
看这个例子
var a = 1; { console.log(a); //报错 let a = 2; }
由于let的劫持,并没有打印1
而是报错a未定义
不仅如此,使用let 不能重复声明变量
{ var a = 1; var a = 2; console.log(a); //2 }
{ let a = 1; let a = 2; console.log(a); //报错:a已声明过 }
使用ES6的let或者说使用块作用域的好处是什么呢
首先变量进一步被限制在“块”中,可以防止变量污染
其次就是防止闭包产生的问题
for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 200); }
由于闭包的原因
控制台打印了10个10
为了得到0~9
我们以前的做法通常是加一个立即执行函数
for(var i = 0; i < 10; i++){ (function(n){ setTimeout(function(){ console.log(n); }, 200); })(i); }
这样通过增加中间函数作用域可以解决问题
但是let可以更好的解决
只需要把var换成let
for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); }, 200); }
这样每次迭代都会进行重新绑定的行为
const
ES6也引入了声明常量的关键字constconst拥有let的全部特点
包括劫持块作用域、无提升行为、不能重复声明等等
但是它用来声明常量
一旦声明就不能更改
const PI = 3.14; PI = 555; //报错
所以使用const声明必须直接初始化
const PI; PI = 555; //报错
关于const还有一点要注意
const foo = { name: 'a', arr: [1,2,3] }; foo.name = 'b'; foo.arr.push(4); console.log(JSON.stringify(foo));
引用值之所以可以改变
是因为我们在内存上拿到的是引用值的地址
和我们C/C++中的指针是一样的
我们修改引用值不该变它的地址
所以const并不能限制我们修改引用值
总结
let、const用于声明块级作用域变量let、const没有提升行为
let、const统治所在块作用域
let、const不能重复声明
let解决闭包产生的问题
const用于声明常量一旦声明不能更改
const必须直接初始化
const不能限制修改引用值
==主页传送门==
相关文章推荐
- ES6 let,const命令和块级作用域
- 开始学习es6(二) let 与 const 及 块级作用域
- ES6之let,const和块级作用域
- ES6 let命令和块级作用域和const命令
- 【es6】【块级作用域 and const】
- es6从入门到放弃之let,const,块级作用域
- 深入理解ES6--块级作用域(let const)
- 搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令
- let、const、var和块级作用域
- ES6笔记(2)-- let的块级作用域
- ES6-let带来了更简单的块级作用域
- [Wondgirl]ECMAScript6(ES6)(二)变量let、var和常量const的定义和区别
- ES6 — 新增关键字let、const
- JS中的块级作用域,var、let、const三者的区别
- ES6新特性:块级作用域let和const
- 笔记:ES6新特性-变量声明关键字:let和const
- ECMAScript6(ES6)之let和const
- ES6之let、const和块级作用域
- ES6 之关键字 let
- 【ES6】var / let / const