ES6深入理解之“let”能替代”var“吗?
前言
我已经使用ES2015(ES6)的语法编写JavaScript程序很久了,并且喜欢上它提供的新特性带来的优雅和简洁。我最习惯的就是不再使用var,而是let/const。我想的以为let仅仅是var的替代者,而事实上let还为我们提供了更加精细的作用域。
我大多数时候使用的变量都是用const来声明,因为如果尝试对使用const声明的变量进行修改,将会报错。这可以避免不小心将一个不该修改的常量值修改。,我们还是需要可以声明可以被修改的变量,比如在循环里面的计数器,我们需要不断地对改变了加1。可是为什么我们使用let而不是var呢?
最简单的答案就是let提供块作用域(block-scoping),这会比var提供的以函数为作用域有更加精细化的控制。为了便于理解,我来用一个经典的前端工程师面试的问题来描述两者的区别。
问题: 在狼蚁网站SEO优化的例子中,请说出控制台的打印结果。
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提供的库。
2、老版本的浏览器不支持let。不仅如此,而且有些也还没有支持let。我们可以使用Babel来避免这个问题,Babel允许你使用所有最新的JavaScript功能,然后将其翻译到甚至IE8都能支持的代码。
原文:
译者:
为了保证可读性,本文采用意译而非直译。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对狼蚁SEO的支持。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程