javascript如何理解this关键字_它的绑定规则是什么【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
JavaScript中this调用时绑定:普通调用非严格模式指向全局对象、严格模式为undefined;对象方法调用指向该对象;箭头函数继承外层this;new调用指向新实例;绑定优先级为new>显式绑定>隐式绑定>默认绑定。

JavaScript 中的 this 不是定义时绑定,而是调用时绑定——它永远指向函数被调用时的“执行上下文对象”,和函数在哪定义、怎么声明完全无关。

普通函数调用时,this 指向什么

在非严格模式下,直接调用函数(如 foo()),this 指向全局对象(浏览器中是 window,Node.js 中是 global);严格模式下则为 undefined

常见错误现象:在回调、定时器或事件处理中直接传入普通函数,this 丢失:

const obj = {
  name: 'Alice',
  say: function() { console.log(this.nam

e); } }; setTimeout(obj.say, 100); // 输出 undefined(严格模式)或 window.name

原因:这里 obj.say 被取出来单独调用,等价于 const fn = obj.say; fn();,已脱离 obj 上下文。

  • 修复方式:用 bind、箭头函数、或改写为 setTimeout(() => obj.say(), 100)
  • 注意:call/apply 可显式指定 this,但只影响当次执行,不改变函数本身

对象方法调用时,this 绑定的是谁

当函数作为对象属性被调用(即 obj.method() 形式),this 指向该对象(obj),这是最直观也最容易依赖的绑定场景。

但要注意“隐式丢失”边界:

  • const fn = obj.method; → 后续 fn() 已不是对象方法调用,this 不再是 obj
  • 嵌套对象中,只有最后一层点号决定 thisobj.nested.method()thisobj.nested,不是 obj
  • 原型链上的方法,this 仍指向调用时的实际对象(不是定义它的原型)

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

箭头函数不绑定 this,它会沿作用域链向上查找最近的非箭头函数的 this 值,并固定住——无法用 callapplybind 改变。

典型使用场景:避免回调中 this 丢失,比如事件监听或 Promise 链:

const obj = {
  name: 'Bob',
  init() {
    document.addEventListener('click', () => {
      console.log(this.name); // 正确输出 'Bob'
    });
  }
};

但这也意味着:箭头函数不能用作构造函数(无 this 实例),也不适合需要动态 this 的场景(如 Vue 或 React 类组件中的事件处理器若需访问实例,有时反而要避免箭头函数)。

new 调用时,this 指向新创建的实例

new 调用函数时,引擎会创建空对象,将其设为 this,并隐式返回该对象(除非显式返回其他对象)。

关键点:

  • 必须是函数表达式或函数声明,不能是箭头函数(new 箭头函数会报 TypeError: xxx is not a constructor
  • 构造函数内部若返回一个对象,则以该对象为准;返回原始值(string/number/etc)会被忽略
  • class 语法本质是函数加语法糖,constructor 内的 this 就是即将返回的实例

真正容易被忽略的是:所有绑定规则优先级有明确顺序——new > 显式绑定(bind/call) > 隐式绑定(对象方法) > 默认绑定(普通调用)。而箭头函数根本不在这个链条里,它从定义时就“抄了作业”。


# vue  # react  # javascript  # java  # js  # node.js  # node  # 处理器  # 浏览器  # app  # win  # String  # 构造函数  # const  # 继承  # class 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 在centOS 7安装mysql 5.7的详细教程  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何使用.env文件管理环境变量?(最佳实践)  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何获取PHP WAP自助建站系统源码?  香港服务器选型指南:免备案配置与高效建站方案解析  创业网站制作流程,创业网站可靠吗?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何快速上传自定义模板至建站之星?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在服务器上三步完成建站并提升流量?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何用y主机助手快速搭建网站?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何有效防御Web建站篡改攻击?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何发送系统通知?(Notification渠道示例)  ,交易猫的商品怎么发布到网站上去?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  新三国志曹操传主线渭水交兵攻略  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  如何基于PHP生成高效IDC网络公司建站源码?  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Linux系统命令中screen命令详解  中山网站制作网页,中山新生登记系统登记流程?  如何续费美橙建站之星域名及服务?  如何用IIS7快速搭建并优化网站站点?  Laravel如何实现API资源集合?(Resource Collection教程)  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何快速查询域名建站关键信息?  javascript中对象的定义、使用以及对象和原型链操作小结  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  活动邀请函制作网站有哪些,活动邀请函文案?  如何挑选最适合建站的高性能VPS主机?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  javascript中闭包概念与用法深入理解