深入理解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执行方法  无锡营销型网站制作公司,无锡网选车牌流程?