news 2026/5/1 14:44:56

JS基础——this

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JS基础——this

一、this绑定规则

this 的本质是函数执行时的动态上下文,它不是定义时决定的(箭头函数除外),而是由调用方式决定。

1. 默认绑定(全局/严格模式)

直接调用函数,非严格模式下this指向全局对象(浏览器window),严格模式下为undefined

function fn() { console.log(this) } fn(); // window / undefined (strict)

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

函数作为对象的属性调用,this指向该对象。

const obj = { name: 'obj', fn() { console.log(this.name) } }; obj.fn(); // 'obj'

隐式丢失:如果函数被单独取出再调用,就退化为默认绑定。

const f = obj.fn; f(); // undefined (默认绑定)

3. 显式绑定(call/apply/bind)

使用callapplybind强制指定 this。

  • call(context, ...args)立即调用

  • apply(context, [args])立即调用

  • bind(context)返回一个新函数,永久绑定 this

function greet() { console.log(this.name); } const person = { name: '李四' }; greet.call(person); // 输出:李四 greet.apply(person); // 输出:李四
  • callapply都会立即执行函数,同时把this绑定在第一个参数上(context)。

  • 区别只是传参方式:call(context, a, b)apply(context, [a, b])

bind比较特殊:它不立即执行,而是返回一个新函数,这个新函数的this被永久锁定为指定对象。

const boundGreet = greet.bind(person); boundGreet(); // 输出:李四 boundGreet.call({ name: '王五' }); // 输出:李四 (已被 bind 锁死,无法再改变)

4.new绑定(构造函数)

箭头函数没有自己的this,它体内的this直接去它被定义时所在的词法作用域里找。

const obj = { name: '对象', normalFn: function() { console.log(this.name); }, arrowFn: () => { console.log(this.name); } }; obj.normalFn(); // 输出:对象(隐式绑定) obj.arrowFn(); // 输出:undefined(这里的 this 是全局,因为定义 arrowFn 时外层作用域是全局)

为什么arrowFn不是输出'对象'
因为箭头函数是在定义时就决定了this,它的this就是定义它时外层代码的this,也就是全局或某个函数。在那个时刻,外层没有obj这个点,所以this指向全局。

最常用的场景:在回调中保留外部的this

function Counter() { this.count = 0; setInterval(() => { this.count++; // 这里的 this 就是 Counter 实例,因为它定义在 Counter 构造函数内 }, 1000); }

规则总结:箭头函数的this词法作用域链的一部分,和调用方式无关。

5.优先级总结

如果多个规则同时出现,优先级从高到低:

  1. 箭头函数?→ 直接取定义时的外层 this,后面的规则都不适用。

  2. 用了new?→ 指向新对象。

  3. 用了bind/call/apply?→ 显式绑定。

  4. 通过对象点出来调用(obj.fn())?→ 隐式绑定。

  5. 啥都没有直接调用?→ 默认绑定(严格下是 undefined,非严格是全局对象)。

6.练习

var name = '全局'; function foo() { console.log(this.name); } const obj1 = { name: 'obj1', foo: foo }; const obj2 = { name: 'obj2' }; obj1.foo(); // ? foo.call(obj2); // ? const bar = obj1.foo; bar(); // ? const bound = foo.bind(obj1); bound(); // ? new foo(); // ?
var name = 'window'; const obj = { name: 'object', inner: { name: 'inner', fn: function() { console.log(this.name); } } }; obj.inner.fn(); // ? const f = obj.inner.fn; f(); // ? f.call(obj); // ? const bound2 = f.bind(obj.inner); new bound2(); // ?

7.答案

var name = '全局'; function foo() { console.log(this.name); } const obj1 = { name: 'obj1', foo: foo }; const obj2 = { name: 'obj2' }; obj1.foo(); // 'obj1' foo.call(obj2); // 'obj2' const bar = obj1.foo; bar(); // '全局' const bound = foo.bind(obj1); bound(); // 'obj1' new foo(); // undefined
var name = 'window'; const obj = { name: 'object', inner: { name: 'inner', fn: function() { console.log(this.name); } } }; obj.inner.fn(); // 'inner' const f = obj.inner.fn; f(); // 'window' f.call(obj); // 'object' const bound2 = f.bind(obj.inner); new bound2(); // undefined
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 14:38:59

中国AI大模型周调用量大降,为啥大家不用了?

今年以来,在龙虾热的带动下,中国AI大模型的调用量大幅增长,但是就在最近中国AI大模型的周调用量突然出现大幅下降,这是怎么回事?为啥大家突然不用了?一、中国AI大模型周调用量大降?《每日经济新…

作者头像 李华
网站建设 2026/5/1 14:37:44

初创团队如何利用 Taotoken 的按 token 计费模式优化研发成本

初创团队如何利用 Taotoken 的按 token 计费模式优化研发成本 1. 初创团队的 AI 研发成本挑战 对于资源有限的初创团队而言,在研发过程中引入 AI 功能往往面临成本控制的难题。传统的大模型接入方式通常需要预付高额费用或购买固定套餐,而团队在开发、…

作者头像 李华
网站建设 2026/5/1 14:36:42

免费Windows 10 OneDrive终极卸载指南:3分钟彻底清理微软云盘

免费Windows 10 OneDrive终极卸载指南:3分钟彻底清理微软云盘 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/on/OneDrive-Uninstaller 还在为Windows 10中…

作者头像 李华
网站建设 2026/5/1 14:35:55

2025届毕业生推荐的十大降AI率网站横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对于维普检测系统的AI降重需求,首要的策略是文本重构以及语义替换,…

作者头像 李华
网站建设 2026/5/1 14:35:54

YOLO26-seg分割优化:卷积魔改 | SPD-Conv,低分辨率图像和小物体涨点明显

💡💡💡现有卷积问题点:这是由于现有CNN常见的设计体系结构中有缺陷,即使用卷积步长和/或池化层,这导致了细粒度信息的丢失和较低效的特征表示的学习。 💡💡💡本文改进点:提出了一个名为SPD-Conv的新的CNN构建块来代替每个卷积步长和每个池化层; 💡💡💡…

作者头像 李华