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项目的完整流程与步骤

