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 26 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
bootstrap可编辑下拉框jquery.editable-select
Oct 12 jQuery
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
Jan 21 jQuery
JS实现简单日历特效
Jan 03 Javascript
js闭包的9个使用场景
Dec 29 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
php跨域调用json的例子
2013/11/13 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
js中的闭包学习心得
2018/02/06 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python入门篇之列表和元组
2014/10/17 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python实现读取json文件到excel表
2017/11/18 Python
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
深入浅析Python代码规范性检测
2020/07/31 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
卫生安全检查制度
2014/02/04 职场文书
《燕子专列》教学反思
2014/02/21 职场文书
党员承诺践诺书
2014/05/20 职场文书
公司安全管理制度范本
2015/08/05 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技