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 相关文章推荐
基于jQuery的计算文本框字数的代码
Jun 06 Javascript
javaScript NameSpace 简单说明介绍
Jul 18 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 Javascript
javascript判断并获取注册表中可信任站点的方法
Jun 01 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
iview同时验证多个表单问题总结
Sep 29 Javascript
JavaScript获取某一天所在的星期
Sep 05 Javascript
js 动态校验开始结束时间的实现代码
May 25 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
基于文本的访客签到簿
2006/10/09 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
Python实现发送与接收邮件的方法详解
2018/03/28 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
详解Python yaml模块
2020/09/23 Python
python Pexpect模块的使用
2020/12/25 Python
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
教学器材管理制度
2014/01/26 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
奶茶店创业计划书
2014/08/14 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
生死抉择观后感
2015/06/09 职场文书