0

0

如何在javascript中正确使用this关键字【教程】

夢幻星辰

夢幻星辰

发布时间:2026-01-30 19:25:40

|

334人浏览过

|

来源于php中文网

原创

JavaScript中this由调用时上下文动态决定;箭头函数无自有this,继承外层普通函数的this;call/apply立即执行并指定this,bind返回预设this的新函数;对象方法赋值后调用会丢失this,需bind或箭头函数字段修复。

如何在javascript中正确使用this关键字【教程】

在 JavaScript 中,this 的值不是由函数定义时决定的,而是由**函数调用时的上下文**动态绑定的——理解这点,就避开了 80% 的坑。

为什么 this 在箭头函数里不指向调用者?

箭头函数没有自己的 this,它会沿作用域链向上查找外层普通函数的 this 值,而不是根据调用方式重绑。

  • 常见错误:在事件回调或定时器中用箭头函数想捕获实例 this,结果拿到的是定义时外层的 this(比如 window 或模块顶层对象)
  • 正确做法:需要动态 this 就用 function 声明;若需固定绑定,优先用 .bind() 或显式传参,而非依赖箭头函数“看起来像闭包”
  • 例外场景:类方法中用箭头函数赋值给实例属性(如 handleClick = () => { ... }),此时靠的是类字段语法把函数绑定到实例,不是靠箭头函数本身的 this 行为

callapplybind 的关键区别

三者都用于手动指定函数执行时的 this,但调用时机和返回值不同。

  • call(thisArg, arg1, arg2, ...):立即执行,参数逐个传入
  • apply(thisArg, [arg1, arg2, ...]):立即执行,参数以数组形式传入(适合转发 arguments 或展开数组)
  • bind(thisArg, arg1, arg2, ...):不执行,返回一个新函数,this 和部分参数被预设(常用于事件监听、防抖、柯里化)
  • 注意:bind 返回的函数无法再用 call/apply 改写其 this(除非是箭头函数或严格模式下非对象 thisArg

对象方法里的 this 为什么会丢失?

当把对象方法赋值给变量或作为回调传入时,函数脱离原始对象调用,this 默认变为 undefined(严格模式)或全局对象(非严格模式)。

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载

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

  • 典型场景:const btn = document.getElementById('x'); btn.onclick = obj.handleClick; —— 此时 handleClick 内的 this 不再是 obj
  • 修复方式:用 obj.handleClick.bind(obj)() => obj.handleClick()(牺牲性能)、或在类中用字段箭头函数(handleClick = () => { ... }
  • ES6 解构也会触发丢失:const { method } = obj; method(); 同样失效

构造函数和 class 中的 this 有什么特殊性?

new 调用时,this 指向新创建的实例;但若忘记 new,普通调用会导致 this 指向全局或 undefined(严格模式)。

  • class 构造器内部的 this 必须由 new 初始化,否则报 TypeError: Class constructor X cannot be invoked without 'new'
  • 类方法默认不绑定 this,和普通对象方法一样存在丢失风险(不像 React class 组件的生命周期方法那样被自动绑定)
  • 静态方法中的 this 指向类本身,而非实例;不能访问 this.xxx 实例属性

真正难的不是记住规则,而是识别「谁在调用这个函数」——遇到 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新特性的相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

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

222

2025.12.24

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

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

531

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

398

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

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

共58课时 | 4.4万人学习

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

共12课时 | 1.0万人学习

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

共12课时 | 1万人学习

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

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