ES6深入理解之“let”能替代”var“吗?


Posted in Javascript onJune 28, 2017

前言

我已经使用ES2015(ES6)的语法编写JavaScript程序很久了,并且喜欢上它提供的新特性带来的优雅和简洁。我最习惯的就是不再使用var,而是let/const。我想当然的以为let仅仅是var的替代者,而事实上let还为我们提供了更加精细的作用域。

我大多数时候使用的变量都是用const来声明,因为如果尝试对使用const声明的变量进行修改,将会报错。这可以避免不小心将一个不该修改的常量值修改。但是,我们还是需要可以声明可以被修改的变量,比如在循环里面的计数器,我们需要不断地对改变了加1。可是为什么我们使用let而不是var呢?

最简单的答案就是let提供块作用域(block-scoping),这会比var提供的以函数为作用域有更加精细化的控制。为了便于理解,我来用一个经典的前端工程师面试的问题来描述两者的区别。

问题: 在下面的例子中,请说出控制台的打印结果。

var callbacks = [];
(function() {
 for (var i = 0; i < 5; i++) {
 callbacks.push( function() { return i; } );
 }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

我们将for循环执行五次,每次将一个函数push到callbacks数组中。最后callbacks数组里面的每一个函数的执行结果打印出来。

一个新手工程师经过深思熟虑可能会回答[0, 1 , 2, 3, 4], 然而却掉入了JavaScript的”hoisting陷阱”。

只有当你理解了hoisting, 才能给出正确的答案[5, 5, 5, 5, 5]。

var callbacks = [];
(function() {
 var i;
 for (i = 0; i < 5; i++) {
 callbacks.push( function() { return i; } );
 }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

注意:上面的代码,JavaScript将变量提升到函数定义的顶部,经过整个for循环,callbacks里面存储的5个函数指向的同一个变量i的值已经是5。所以最终打印出来的值都为5。

在以前要通过各种奇淫技巧来解决这个问题,并成功返回[0, 1, 2, 3, 4], 现在我们有了let,就可以很简单解决问题:

var callbacks = [];
(function() {
 for (let i = 0; i < 5; i++) {
 callbacks.push( function() { return i; } );
 }
})();
console.log(callbacks.map( function(cb) { return cb(); } ));

因为let拥有块作用域,所以使用let声明的变量i不会被提升到函数顶部,i的作用域在for循环, 就会每次循环有独立的值。

那我们是不是应该不要使用var了呢?如果你想要一个变量拥有函数作用域,var还是很有用的。

读者提到的两个问题:

1、const声明的变量不是完全不可更改。比如:

const myNotQuiteImmutableObject = {
 thisCanBeChanged: "not immutable"
};
myNotQuiteImmutableObject.thisCanBeChanged = "see I changed it.";

但是,使用const声明可以阻止一些基本的更改,比如:

const immutableString = "you can't change me";
immutableString = "D'OH!"; // error

如果你想要完全的不可更改,可以使用Facebook提供的Immutable库。

2、老版本的浏览器不支持let。不仅如此,而且有些最新的浏览器也还没有支持let。我们可以使用Babel来避免这个问题,Babel允许你使用所有最新的JavaScript功能,然后将其翻译到甚至IE8都能支持的代码。

原文: Why You Shouldn't Use ‘var' Anymore

译者: Fundebug

为了保证可读性,本文采用意译而非直译。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
jQuery focus和blur事件的应用详解
Jan 26 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
浅谈Vue 初始化性能优化
Aug 31 Javascript
vue.js整合mint-ui里的轮播图实例代码
Dec 27 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
详解webpack4多入口、多页面项目构建案例
May 25 Javascript
vue.js 中使用(...)运算符报错的解决方法
Aug 09 Javascript
vue子路由跳转实现tab选项卡
Jul 24 Javascript
Vue中keep-alive组件的深入理解
Aug 23 Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 #jQuery
AngularJS实现单一页面内设置跳转路由的方法
Jun 28 #Javascript
JavaScript中常见的八个陷阱总结
Jun 28 #Javascript
通过构造函数实例化对象的方法
Jun 28 #Javascript
JS之if语句对接事件动作逻辑(详解)
Jun 28 #Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 #Javascript
Node.js 8 中的重要新特性
Jun 28 #Javascript
You might like
PHP 简单数组排序实现代码
2009/08/05 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
python原始套接字编程示例分享
2014/02/21 Python
Python中的匿名函数使用简介
2015/04/27 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Python闭包函数定义与用法分析
2018/07/20 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
python 安装impala包步骤
2020/03/28 Python
Python extract及contains方法代码实例
2020/09/11 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
全球性的在线商店:Vogca
2019/05/10 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
入团者的自我评价分享
2013/12/02 职场文书
工业自动化毕业生自荐信范文
2014/01/04 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
小学生植树节活动总结
2014/07/04 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书