讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript this指向_如何绑定正确上下文

千萱同学_8318

千萱同学_8318

发布时间:2026-01-09 19:36:01

|

329人浏览过

|

来源于php中文网

原创

箭头函数无自身this,继承外层词法作用域;call/apply立即执行并指定this,bind返回永久绑定新函数;类方法需显式绑定以防this丢失;事件监听器中普通函数的this默认指向currentTarget。

javascript this指向_如何绑定正确上下文

箭头函数里没有自己的 this,它直接继承外层作用域

这是最容易被误用的点:很多人以为箭头函数能“绑定” this,其实它根本没 this 可绑。只要函数体是箭头函数,this 就永远取自定义时的外层词法作用域,和调用方式无关。

常见错误现象:

  • 在对象方法中写 () => console.log(this),结果打印出全局对象(浏览器是 window,Node 是 global)或 undefined(严格模式)
  • 给事件监听器传箭头函数,期望 this 指向触发元素,实际指向外层函数的 this

正确做法:

  • 需要动态绑定 this 的场景(如事件回调、定时器、异步回调),改用普通函数
  • 若必须用箭头函数,确保外层作用域的 this 已是你想要的对象(比如在类构造器里提前用 bind 或赋值为变量)

call / apply / bind 的区别和适用时机

三者都能显式指定函数执行时的 this,但行为不同:

立即学习“Java免费学习笔记(深入)”;

  • call 立即执行,参数逐个传入:fn.call(obj, a, b)
  • apply 立即执行,参数以数组形式传入:fn.apply(obj, [a, b])
  • bind 不执行,返回一个新函数,this 被永久绑定:const boundFn = fn.bind(obj)

性能与兼容性注意:

React Flow Implementation
React Flow Implementation

使用 @xyflow/react正确实现 React Flow 节点式用户界面。适用于构建流程图、图表、可视化编辑器或节点式应用程序...

下载
  • bind 返回的函数无法再用 call 或 apply 改变 this(已被硬绑定)
  • ES6+ 中,bind 生成的函数的 length 属性是 0(不计入绑定参数),可能影响某些依赖形参个数的库
  • 在频繁调用的回调中(如 requestAnimationFrame),避免反复 bind,应提前绑定或用变量缓存

类方法中 this 丢失的典型场景和修复方式

React 类组件、自定义类中,把方法直接传给子组件或事件处理器时,this 极易丢失 —— 因为只是传递了函数引用,没绑定上下文。

示例问题代码:

class Button {
  constructor() {
    this.label = 'Click me';
  }
  handleClick() {
    console.log(this.label); // undefined
  }
  render() {
    return <button onclick="this.handleClick">{this.label}</button>;
  }
}

修复方案(按推荐顺序):

  • 构造器中绑定:this.handleClick = this.handleClick.bind(this)
  • 使用类字段语法(需 Babel/TS):handleClick = () => { ... }(本质是箭头函数 + 外层 this 继承)
  • 调用时临时绑定:<button onclick="this.handleClick.bind(this)">(不推荐,每次渲染都新建函数)

事件监听器里的 this 默认指向谁?怎么控制?

原生 DOM 事件中,普通函数作为监听器时,this 默认指向触发该事件的元素(event.currentTarget),不是 event.target,也不是定义函数时的作用域。

但这个默认行为只在以下情况成立:

  • 用 addEventListener 添加监听器(且没用箭头函数)
  • 用 HTML 内联 onclick 时,this 指向当前元素(但内联写法已不推荐)

容易踩的坑:

  • 用 addEventListener 传箭头函数:el.addEventListener('click', () => console.log(this)) → this 是外层作用域,不是 el
  • 想在监听器里访问组件实例,又不想污染 this,推荐从闭包捕获:const self = this; el.addEventListener('click', function() { console.log(self); })
  • 用 event.currentTarget 替代 this 更可靠,尤其在事件代理中
真正难的不是记住规则,而是判断「此刻我到底希望 this 指向什么」—— 是调用者?定义者?还是某个固定对象?一旦目标模糊,所有绑定手段都会变成障眼法。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

265

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

386

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

335

2025.12.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1918

2023.09.20

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1687

2023.09.19

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

3533

2025.07.29

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

776

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

5343

2024.05.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 11.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn