深入理解Javascript箭头函数中的this
发布时间 - 2026-01-10 23:00:18 点击率:次首先我们先看一段代码,这是一个实现倒数功能的类「Countdown」及其实例化的过程:
function Countdown(seconds) {
this._seconds = seconds;
}
Countdown.prototype._step = function() {
console.log(this._seconds);
if (this._seconds > 0) {
this._seconds -= 1;
} else {
clearInterval(this._timer);
}
};
Countdown.prototype.start = function() {
this._step();
this._timer = setInterval(function() {
this._step();
}, 1000);
};
new Countdown(10).start();
运行这段代码时,将会出现异常「this._step is not a function」。
这是Javascript中颇受诟病的「this错乱」问题:setInterval重复执行的函数中的this已经跟外部的this不一致了。
要解决这个问题,有三个方法。
闭包
新增一个变量指向期望的this,然后将该变量放到闭包中:
Countdown.prototype.start = function() {
var self = this;
this._step();
this._timer = setInterval(function() {
self._step();
}, 1000);
};
bind函数
ES5给函数类型新增的「bind」方法可以改变函数(实际上是返回了一个新的函数)的「this」:
Countdown.prototype.start = function() {
this._step();
this._timer = setInterval(function() {
this._step();
}.bind(this), 1000);
};
箭头函数
这正是本文要重点介绍的解决方案。箭头函数是ES6中新增的语言特性,表面上看,它只是使匿名函数的编码更加简短,但实际上它还隐藏了一个非常重要的细节——箭头函数会捕获其所在上下文的this作为自己的this。也就是说,箭头函数内部与其外部的this是保持一致的。
所以,解决方案如下:
Countdown.prototype.start = function() {
this._step();
this._timer = setInterval(() => {
this._step();
}, 1000);
};
这无疑使this的处理更加方便了。然而,对各位Javascript Coder而言,判断this指向时的情况可就又多了一种了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# 箭头函数
# this
# es6
# js
# JavaScript中的普通函数和箭头函数的区别和用法详解
# 深入理解JavaScript中的箭头函数
# JavaScript箭头(arrow)函数详解
# JavaScript箭头函数中的this详解
# JS中箭头函数与this的写法和理解
# 深入理解JavaScript 箭头函数
# JavaScript箭头函数的五种使用方法及三点注意事项
# JavaScript中箭头函数与普通函数的区别详解
# 一文彻底讲通JavaScript普通函数与箭头函数的区别
# 自己的
# 这是
# 将会
# 这段
# 这是一个
# 上看
# 可就
# 非常重要
# 这篇文章
# 在上
# 它还
# 其所
# 又多
# 将该
# 先看
# 解决这个问题
# 颇受
# 种了
# 包中
# 便了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何确保西部建站助手FTP传输的安全性?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
长沙企业网站制作哪家好,长沙水业集团官方网站?
JS弹性运动实现方法分析
如何在香港服务器上快速搭建免备案网站?
网站制作软件有哪些,制图软件有哪些?
Android滚轮选择时间控件使用详解
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Android实现代码画虚线边框背景效果
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何实现建站之星域名转发设置?
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel如何使用Blade组件和插槽?(Component代码示例)
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
php485函数参数是什么意思_php485各参数详细说明【介绍】
Laravel如何处理异常和错误?(Handler示例)
Laravel如何实现数据库事务?(DB Facade示例)
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Android中AutoCompleteTextView自动提示
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel怎么实现验证码(Captcha)功能
JavaScript中的标签模板是什么_它如何扩展字符串功能
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel如何实现用户密码重置功能?(完整流程代码)
浅谈javascript alert和confirm的美化
Android自定义listview布局实现上拉加载下拉刷新功能
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
如何快速搭建虚拟主机网站?新手必看指南
香港服务器租用费用高吗?如何避免常见误区?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何快速启动建站代理加盟业务?
Laravel如何处理CORS跨域请求?(配置示例)
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何自定义建站之星网站的导航菜单样式?
高性价比服务器租赁——企业级配置与24小时运维服务
如何快速搭建支持数据库操作的智能建站平台?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
无锡营销型网站制作公司,无锡网选车牌流程?

