如何在javascript中正确使用this关键字【教程】
发布时间 - 2026-01-30 00:00:00 点击率:次JavaScript中this由调用时上下文动态决定;箭头函数无自有this,继承外层普通函数的this;call/apply立即执行并指定this,bind返回预设this的新函数;对象方法赋值后调用会丢失this,需bind或箭头函数字段修复。
在 JavaScript 中,this 的值不是由函数定义时决定的,而是由**函数调用时的上下文**动态绑定的——理解这点,就避开了 80% 的坑。
为什么 this 在箭头函数里不指向调用者?
箭头函数没有自己的 this,它会沿作用域链向上查找外层普通函数的 this 值,而不是根据调用方式重绑。
- 常见错误:在事件回调或定时器中用箭头函数想捕获实例
this,结果拿到的是定义时外层的this(比如window或模块顶层对象) - 正确做法:需要动态
this就用function声明;若需固定绑定,优先用.bind()或显式传参,而非依赖箭头函数“看起来像闭包” - 例外场景:类方法中用箭头函数赋值给实例属性(如
handleClick = () => { ... }),此时靠的是类字段语法把函数绑定到实例,不是靠箭头函数本身的this行为
call、apply 和 bind 的关键区别
三者都用于手动指定函数执行时的 this,但调用时机和返回值不同。
-
call(thisArg, arg1, arg2, ...):立即执行,参数逐个传入 -
apply(thisArg, [arg1, arg2, ...]):立即执行,参数以数组形式传入(适合转发arguments或展开数组) -
bind(thisArg, arg1, arg2, ...):不执行,返回一个新函数,this和部分参数被预设(常
用于事件监听、防抖、柯里化)
- 注意:
bind返回的函数无法再用call/apply改写其this(除非是箭头函数或严格模式下非对象thisArg)
对象方法里的 this 为什么会丢失?
当把对象方法赋值给变量或作为回调传入时,函数脱离原始对象调用,this 默认变为 undefined(严格模式)或全局对象(非严格模式)。
- 典型场景:
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 异常,先打断点看调用栈,再查函数是如何被传递和执行的。其他所有技巧,都是对这个事实的妥协或封装。
# react
# javascript
# es6
# java
# app
# 栈
# win
# 区别
# 作用域
# 为什么
# 封装
# 构造函数
# const
# 继承
# class
# 闭包
# undefined
# function
# 对象
# 事件
# constructor
# 严格模式
# this
# 绑定
# 的是
# 是由
# 而非
# 回调
# 自己的
# 都是
# 有什么
# 也会
# 开了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何集成Inertia.js与Vue/React?(安装配置)
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
怎么用AI帮你设计一套个性化的手机App图标?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
如何用狗爹虚拟主机快速搭建网站?
大连 网站制作,大连天途有线官网?
js代码实现下拉菜单【推荐】
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
如何用好域名打造高点击率的自主建站?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
javascript中闭包概念与用法深入理解
Laravel如何处理CORS跨域请求?(配置示例)
高端企业智能建站程序:SEO优化与响应式模板定制开发
在线制作视频的网站有哪些,电脑如何制作视频短片?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何利用DOS批处理实现定时关机操作详解
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何选择可靠的免备案建站服务器?
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
网站制作软件有哪些,制图软件有哪些?
大型企业网站制作流程,做网站需要注册公司吗?
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel如何实现数据库事务?(DB Facade示例)
Python进程池调度策略_任务分发说明【指导】
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
深圳网站制作培训,深圳哪些招聘网站比较好?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel如何使用Service Container和依赖注入?(代码示例)
网站建设保证美观性,需要考虑的几点问题!
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
使用豆包 AI 辅助进行简单网页 HTML 结构设计
Laravel如何实现API资源集合?(Resource Collection教程)
使用spring连接及操作mongodb3.0实例
如何用腾讯建站主机快速创建免费网站?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程


