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 - 嵌套对象中,只有最后一层点号决定
this:obj.nested.method()的this是obj.nested,不是obj - 原型链上的方法,
this仍指向调用时的实际对象(不是定义它的原型)
箭头函数没有自己的 this,它继承外层作用域
箭头函数不绑定 this,它会沿作用域链向上查找最近的非箭头函数的 this 值,并固定住——无法用 call、apply、bind 改变。
典型使用场景:避免回调中 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中闭包概念与用法深入理解


