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 相关文章推荐
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
js获取url中&quot;?&quot;后面的字串方法
May 15 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
Feb 27 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
Apr 21 Javascript
对象转换为原始值的实现方法
Jun 06 Javascript
js style.display=block显示布局错乱问题的解决方法
Sep 21 Javascript
纯js实现悬浮按钮组件
Dec 17 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
简述JS控制台的使用
Jul 15 Javascript
区分vue-router的hash和history模式
Oct 03 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数组最大值,最小值的代码
2011/10/31 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
Python内置函数dir详解
2015/04/14 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
如何基于Python创建目录文件夹
2019/12/31 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
Python远程方法调用实现过程解析
2020/07/28 Python
python绘制汉诺塔
2021/03/01 Python
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
电脑销售顾问自荐信
2014/01/29 职场文书
活动宣传策划方案
2014/05/23 职场文书
党员评议个人总结
2014/10/20 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
优化Mysql查询的示例
2022/04/26 MySQL
MySQL数据库简介与基本操作
2022/05/30 MySQL