0

0

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

夢幻星辰

夢幻星辰

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

|

309人浏览过

|

来源于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)

性能与兼容性注意:

Notion Sites
Notion Sites

Notion 推出的AI网站构建工具,允许用户将 Notion 页面直接发布为完整网站。

下载
  • bind 返回的函数无法再用 callapply 改变 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)"></button>(不推荐,每次渲染都新建函数)

事件监听器里的 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 指向什么」—— 是调用者?定义者?还是某个固定对象?一旦目标模糊,所有绑定手段都会变成障眼法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

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

106

2023.07.17

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

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

197

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

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

231

2025.12.24

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

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

562

2023.09.20

length函数用法
length函数用法

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

953

2023.09.19

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

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

151

2025.07.29

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

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

420

2023.08.08

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

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

541

2024.05.29

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

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

共58课时 | 5.9万人学习

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

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号