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 相关文章推荐
设置checkbox为只读(readOnly)的两种方式
Oct 11 Javascript
js数组操作方法总结(必看篇)
Nov 22 Javascript
DropDownList实现可输入可选择(两种版本可选)
Dec 07 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
浅析Vue 和微信小程序的区别、比较
Aug 03 Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 Javascript
JQuery animate动画应用示例
May 14 jQuery
Layui实现主窗口和Iframe层参数传递
Nov 14 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
微信小程序单选框自定义赋值
May 26 Javascript
vue 修改 data 数据问题并实时显示操作
Sep 07 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
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
纯javascript版日历控件
2016/11/24 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
python的id()函数解密过程
2012/12/25 Python
python实现简易内存监控
2018/06/21 Python
python正则表达式之对号入座篇
2018/07/24 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
Python time库基本使用方法分析
2019/12/13 Python
Python中求对数方法总结
2020/03/10 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
大学生助学金感谢信
2015/01/21 职场文书
五一劳动节活动总结
2015/02/09 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书