如何在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 行为

callapplybind 的关键区别

三者都用于手动指定函数执行时的 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自定义表单验证规则教程