ES6深入理解之“let”能替代”var“吗?

发布时间 - 2026-01-11 02:05:35    点击率:

前言

我已经使用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

为了保证可读性,本文采用意译而非直译。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# es6  # let与var的区别  # var  # let  # es6中var与let的区别  # JavaScript ES6中const、let与var的对比详解  # JS变量中有var定义和无var定义的区别以及es6中let命令和const命令  # 深入浅出ES6之let和const命令  # ES6新特性一: let和const命令详解  # ES6入门教程之let和const命令详解  # ES6入门教程之let、const的使用方法  # ES6中let 和 const 的新特性  # 详解ES6中的let命令  # 深入理解ES6中let和闭包  # ES6 let和const定义变量与常量的应用实例分析  # 可以使用  # 你想要  # 打印出来  # 都是  # 我想  # 就会  # 将会  # 都能  # 当你  # 这个问题  # 将其  # 很简单  # 深思熟虑  # 提升到  # 仅仅是  # 解决问题  # 不支持  # 这篇文章  # 不仅如此  # 报错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 在线制作视频的网站有哪些,电脑如何制作视频短片?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  长沙做网站要多少钱,长沙国安网络怎么样?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Bootstrap整体框架之CSS12栅格系统  Laravel如何实现多对多模型关联?(Eloquent教程)  香港服务器建站指南:免备案优势与SEO优化技巧全解析  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Python并发异常传播_错误处理解析【教程】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  装修招标网站设计制作流程,装修招标流程?  如何在万网自助建站平台快速创建网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何在万网自助建站中设置域名及备案?  英语简历制作免费网站推荐,如何将简历翻译成英文?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  百度浏览器如何管理插件 百度浏览器插件管理方法  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Swift开发中switch语句值绑定模式  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何在IIS中新建站点并解决端口绑定冲突?  如何用景安虚拟主机手机版绑定域名建站?  香港服务器部署网站为何提示未备案?  制作公司内部网站有哪些,内网如何建网站?  在Oracle关闭情况下如何修改spfile的参数  如何正确下载安装西数主机建站助手?  Laravel如何使用查询构建器?(Query Builder高级用法)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Swift中switch语句区间和元组模式匹配  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何基于云服务器快速搭建个人网站?  Laravel如何处理和验证JSON类型的数据库字段  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  浅述节点的创建及常见功能的实现  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何将凡科建站内容保存为本地文件?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤