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中style属性
Oct 11 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
Jun 04 Javascript
实现动画效果核心方式的js代码
Sep 27 Javascript
angularJS 入门基础
Feb 09 Javascript
对Angular.js Controller如何进行单元测试
Oct 25 Javascript
windows下vue-cli及webpack搭建安装环境
Apr 25 Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 Javascript
javascript trie前缀树的示例
Jan 29 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
微信小程序如何获取手机验证码
Nov 04 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
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下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python实现小球弹跳效果
2019/05/10 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
园林资料员岗位职责
2013/12/30 职场文书
中学生校园广播稿
2014/01/16 职场文书
庆六一活动总结
2014/08/29 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
单位员工收入证明样本
2014/10/09 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
python字符串的一些常见实用操作
2022/04/06 Python