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 相关文章推荐
List Installed Hot Fixes
Jun 12 Javascript
Javascript 各浏览器的 Javascript 效率对比
Jan 23 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
JS实现控制文本框的内容
Jul 10 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
Sep 22 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 Javascript
Vue 禁用浏览器的前进后退操作
Sep 04 Javascript
教你一步步实现一个简易promise
Nov 02 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中ajax使用实例教程
2014/08/22 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
javascript 时间比较实现代码
2009/10/28 Javascript
javascript 面向对象继承
2009/11/26 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
2013/10/10 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
layer插件select选中默认值的方法
2018/08/14 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
python3.x实现发送邮件功能
2018/05/22 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python自动识别文本编码格式代码
2019/12/26 Python
pycharm导入源码的具体步骤
2020/08/04 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
学生个人自我鉴定范文
2014/03/28 职场文书
优秀会计求职信
2014/07/04 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
学用政策心得体会
2014/09/10 职场文书
四风对照检查材料范文
2014/09/27 职场文书
考试作弊检讨
2015/01/27 职场文书
国庆阅兵观后感
2015/06/15 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript