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 倒计时效果实现秒杀思路
Sep 11 Javascript
JavaScript 学习笔记之基础中的基础
Jan 13 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
Node.js如何自动审核团队的代码
Jul 20 Javascript
jQuery的ready方法实现原理分析
Oct 26 Javascript
webpack独立打包和缓存处理详解
Apr 03 Javascript
js实现数字递增特效【仿支付宝我的财富】
May 05 Javascript
JS实现点击按钮可实现编辑功能
Jul 03 Javascript
深入学习JavaScript中的bom
May 27 Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
Feb 19 Javascript
JS中作用域以及变量范围分析
Jul 18 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数组总结篇(一)
2008/09/30 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
php获取url参数方法总结
2014/11/13 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Django中的Signal代码详解
2018/02/05 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
python实现简单猜单词游戏
2020/12/24 Python
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
毕业生实习鉴定
2013/12/11 职场文书
司仪主持词两篇
2014/03/22 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2016高考寄语集锦
2015/12/04 职场文书