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 相关文章推荐
几款极品的javascript压缩混淆工具
May 16 Javascript
JS 实现点击a标签的时候让其背景更换
Oct 15 Javascript
javascript按位非运算符的使用方法
Nov 14 Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
AngularJs实现分页功能不带省略号的代码
May 30 Javascript
jQuery展示表格点击变色、全选、删除
Jan 05 Javascript
在vue里使用codemirror遇到的问题
Nov 01 Javascript
vue获取验证码倒计时组件
Aug 26 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
Dec 09 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
php常用数学函数汇总
2014/11/21 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
python处理xml文件的方法小结
2017/05/02 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
Python实现注册、登录小程序功能
2018/09/21 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
大二学生职业生涯规划书
2014/02/05 职场文书
财务总监管理职责范文
2014/03/09 职场文书
工作推荐信范文
2014/05/10 职场文书
2014国庆节标语口号
2014/09/19 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
优秀教研组申报材料
2014/12/26 职场文书
企业计划生育责任书
2015/05/09 职场文书
离职信范文
2015/06/23 职场文书
django中websocket的具体使用
2022/01/22 Python
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis