值得一看
广告
彩虹云商城
广告

热门广告位

JavaScript this绑定规则与实现

this的指向由调用方式决定,共五种绑定规则:默认绑定指向全局或undefined,隐式绑定指向调用对象,显式绑定通过call/apply/bind指定,new绑定指向新实例,箭头函数词法继承外层this;优先级为new > 显式 > 隐式 > 默认。

javascript this绑定规则与实现

在 JavaScript 中,this 的指向问题一直是开发者容易混淆的核心概念之一。this 的值不是由函数定义的位置决定,而是由函数的调用方式动态确定。理解 this 的绑定规则及其底层实现机制,有助于写出更稳定、可预测的代码。

1. 默认绑定:独立函数调用

当函数作为普通函数被调用时,this 指向全局对象(在浏览器中是 window,在 Node.js 中是 global)。严格模式下,默认绑定的 this 为 undefined。

注意:

  • 非严格模式:function fn() { console.log(this); } fn(); 输出 window
  • 严格模式:'use strict'; function fn() { console.log(this); } 输出 undefined

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

当函数作为对象的方法被调用时,this 指向该对象。

const obj = {
name: 'Alice',
greet() {
console.log(this.name);
}
};
obj.greet(); // 输出 Alice

但要注意隐式丢失的情况:

立即学习“Java免费学习笔记(深入)”;

const greet = obj.greet;
greet(); // 输出 undefined(严格模式)或全局 name(非严格)

此时 this 不再指向 obj,而是遵循默认绑定规则。

3. 显式绑定:call、apply 和 bind

通过 call、apply 或 bind 方法,可以手动指定函数执行时的 this 值。

  • call/apply:立即执行函数,参数分别为列表和数组
  • bind:返回一个新函数,其 this 被永久绑定
function introduce(age) {
console.log(`I'm ${this.name}, ${age} years old.`);
}
introduce.call({ name: 'Bob' }, 25); // 输出 I'm Bob, 25 years old.
const boundFn = introduce.bind({ name: 'Charlie' });
boundFn(30); // 输出 I'm Charlie, 30 years old.

4. new 绑定:构造函数调用

使用 new 调用函数时,会创建一个新对象,this 指向这个新实例。

function Person(name) {
this.name = name;
}
const p = new Person('David');
console.log(p.name); // 输出 David

new 的过程大致如下:

ViiTor实时翻译

ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译116

查看详情
ViiTor实时翻译

  • 创建一个空对象
  • 将构造函数的 prototype 赋给新对象的 __proto__
  • 将 this 绑定到新对象并执行构造函数
  • 返回新对象(除非构造函数显式返回一个对象)

5. 箭头函数:词法绑定

箭头函数没有自己的 this,它的 this 继承自外层作用域(词法环境)。

const obj = {
name: 'Eve',
normalFn: function() {
console.log(this.name);
},
arrowFn: () => {
console.log(this.name);
}
};
obj.normalFn(); // 输出 Eve
obj.arrowFn();  // 输出 undefined(this 指向外层,通常是全局或模块)

因此箭头函数不能作为构造函数使用,也无法通过 call/apply/bind 改变 this。

6. this 绑定优先级

当多种绑定规则同时存在时,优先级从高到低为:

  1. new 绑定
  2. 显式绑定(bind)
  3. 隐式绑定
  4. 默认绑定

例如,即使使用 bind 绑定了 this,new 仍会覆盖它:

function fn() { console.log(this.x); }
const bound = fn.bind({ x: 1 });
new bound(); // 输出 undefined(new 创建的新对象没有 x)
// 若构造函数返回原始值,则忽略;若返回对象,则以返回值为准

7. 实现 bind 函数

bind 的核心功能是返回一个绑定 this 的函数,并支持预设参数。可以手动实现一个简易版本:

Function.prototype.myBind = function(context, ...args) {
if (typeof this !== 'function') {
throw new Error('not a function');
}
const fn = this;
const bound = function(...innerArgs) {
// 判断是否被 new 调用
return fn.apply(
this instanceof bound ? this : context,
args.concat(innerArgs)
);
};
// 维护原型链
bound.prototype = Object.create(this.prototype);
return bound;
};

这个实现处理了 this 的正确绑定,并支持 new 调用时的优先级。

基本上就这些。掌握 this 的五种绑定规则和它们之间的优先关系,能有效避免常见错误。实际开发中建议多用箭头函数明确上下文,或使用 bind 固定关键函数的 this,提升代码可维护性。

相关标签:

javascript java js node.js node 浏览器 app win 作用域 JavaScript Object if 构造函数 throw Error const 继承 JS console undefined function 对象 作用域 typeof 严格模式 this prototype

大家都在看:

如何使用正则表达式从文本中提取特定单词及相邻数字
JavaScript文本智能换行:按指定字符长度分割字符串
在 React Data Grid 中实现动态列的生成与数据绑定
在特定括号内转义双引号:JavaScript字符串处理实践
使用 JavaScript 从列表中删除特定项
温馨提示: 本文最后更新于2025-10-30 22:41:23,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容