JavaScript中的this关键字是什么_它的绑定规则有哪些?

发布时间 - 2025-12-30 00:00:00    点击率:
this 是 JavaScript 中动态绑定的关键字,其值取决于函数调用方式:默认绑定(非严格→全局对象,严格→undefined)、隐式绑定(obj.method→obj)、显式绑定(call/apply/bind)、new 绑定(优先级最高,指向新实例)及箭头函数(词法继承外层 this)。

this 是 JavaScript 中一个特殊的关键字,它指向函数当前执行时的“执行上下文”中的对象。它的值不是在函数定义时确定的,而是在函数被调用时动态绑定的——也就是说,同一个函数,不同调用方式,this 可能指向完全不同的对象

默认绑定(非严格模式 vs 严格模式)

当函数作为普通函数调用(即不通过对象属性、new 或 call/apply/bind 调用)时,this 的绑定取决于是否启用严格模式:

  • 非严格模式下,this 指向全局对象(浏览器中是 window,Node.js 中是 global
  • 严格模式下,this 保持为 undefined

例如:

function foo() { console.log(this); }
foo(); // 非严格:window;严格:undefined

隐式绑定(对象方法调用)

当函数作为对象的属性被调用时(即形如 obj.method()),this 绑定到该对象(即点号左边的对象)。

  • 只看调用位置最靠近的那层对象,嵌套不影响
  • 如果把方法赋值给变量再调用,会丢失隐式绑定,退回到默认绑定

例如:

const obj = { name: 'Alice', say: function() { console.log(this.name); } };
obj.say(); // 'Alice' —— this 指向 obj
const fn = obj.say;
fn(); // undefined(严格模式)或 window.name(非严格)

显式绑定(call、apply、bind)

通过 call()apply()bind() 可以强制指定函数运行时的 this 值:

  • call(obj, arg1, arg2...):立即执行,参数逐个传入
  • apply(obj, [args]):立即执行,参数以数组形式传入
  • bind(obj, arg1, arg2...):返回一个新函数,this 固定为 obj,后续调用时生效

注意:硬绑定(bind)优先级高于隐式绑定;new 调用可覆盖 bind,但普通 call/apply 无法覆盖 new。

new 绑定(构造函数调用)

使用 new 调用函数时,会创建一个新对象,并将 this 绑定到这个新对象上,同时该对象原型指向函数的 prototype。

  • new 调用优先级最高,会覆盖默认、隐式和显式(bind)绑定
  • 箭头函数没有自己的 this,也不可被 new 调用

例如:

function Person(name) { this.name = name; }
const p = new Person('Bob'); // this 指向新创建的 p 实例

箭头函数的 this(词法绑定)

箭头函数不绑定自己的 this,而是**继承外层普通函数作用域中的 this 值**,且该绑定无法被 call/apply/bind 或 new 改变。

  • 适合用于回调、事件处理器等需要保持外层 this 的场景
  • 不能用作构造函数,没有 arguments 和 prototype

例如:

const obj = {
name: 'Charlie',
regular() { setTimeout(function() { console.log(this.name); }, 100); },
arrow() { setTimeout(() => { console.log(this.name); }, 100); }
};
obj.regular(); // undefined(非严格下是 window.name)
obj.arrow(); // 'Charlie'


# javascript  # java  # js  # node.js  # node  # 处理器  # 浏览器  # app  # win  # 作用域 


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


相关推荐: Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何用AI帮你把自己的生活经历写成一个有趣的故事?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  百度浏览器如何管理插件 百度浏览器插件管理方法  网站建设整体流程解析,建站其实很容易!  在线制作视频的网站有哪些,电脑如何制作视频短片?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何快速上传建站程序避免常见错误?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  北京的网站制作公司有哪些,哪个视频网站最好?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何用搬瓦工VPS快速搭建个人网站?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  深圳网站制作平台,深圳市做网站好的公司有哪些?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Angular 表单中正确绑定输入值以确保提交与验证正常工作  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在Windows环境下新建FTP站点并设置权限?  Swift中swift中的switch 语句  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Python高阶函数应用_函数作为参数说明【指导】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  WordPress 子目录安装中正确处理脚本路径的完整指南  如何打造高效商业网站?建站目的决定转化率  如何在Windows虚拟主机上快速搭建网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  如何快速搭建安全的FTP站点?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  音响网站制作视频教程,隆霸音响官方网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何为不同团队 ID 动态生成多个非值班状态按钮  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  HTML 中动态设置元素 name 属性的正确语法详解  Python文件流缓冲机制_IO性能解析【教程】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  免费网站制作appp,免费制作app哪个平台好?  zabbix利用python脚本发送报警邮件的方法  个人摄影网站制作流程,摄影爱好者都去什么网站?  PythonWeb开发入门教程_Flask快速构建Web应用  非常酷的网站设计制作软件,酷培ai教育官方网站?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  php打包exe后无法访问网络共享_共享权限设置方法【教程】