this 的指向与 bind() 方法详解

this 的指向与 bind() 方法详解

在 JavaScript 中,this 的值取决于函数的调用方式

很多初学者在函数、方法、构造函数、箭头函数中常常混淆 this 的指向。

这篇笔记带你彻底搞清楚!


一、this 的指向规则

kotlin 复制代码
/* 根据函数调用的方式不同,this 的值也不同 */

1️⃣ 以函数形式调用:this 是 window(或 undefined 严格模式下)

2️⃣ 以方法形式调用:this 是调用该方法的对象

3️⃣ 构造函数中调用:this 是新创建的对象实例

4️⃣ 箭头函数:没有自己的 this,由外层作用域决定

5️⃣ call/apply 调用:第一个参数就是函数的 this

6️⃣ bind 调用:this 永远由 bind 的第一个参数决定(无法再修改)

二、bind() 的作用与特性

bind() 是函数的一个方法,用于创建一个新的函数 ,这个新函数的 this 和部分参数被固定。

kotlin 复制代码
bind() 有两个主要功能:
1️⃣ 绑定 this 指向
2️⃣ 预绑定部分参数(类似柯里化)

示例一:绑定 this 与参数

javascript 复制代码
function fn(a, b) {
  console.log('this ->', this);
  console.log('参数:', a, b);
}

const obj = { name: 'linxi' };

// bind() 绑定 this 和第一个参数
const exam = fn.bind(obj, 4);

exam(19, 20);

输出分析:

  • this -> { name: 'linxi' }
  • a = 4(绑定时已传入)
  • b = 19(调用时传入的第一个参数)
  • 20 多余,无意义

bind 的预绑定参数类似于 "函数模板",提前固定一部分参数。


三、箭头函数的特殊性

箭头函数与普通函数的最大区别之一:
没有自己的 this,也没有 arguments。

ini 复制代码
const obj2 = () => {
  console.log(this);
};

obj3 = obj2.bind({ name: 'linxi' });

obj2();
obj3();

输出分析:

  • 两次输出相同的 this(取决于外层作用域)
  • bind() 对箭头函数无效
  • 箭头函数不会创建自己的 thisarguments

无法通过 call()apply()bind() 改变箭头函数的 this


四、知识小结

调用方式 this 指向
普通函数调用 window(或 undefined 严格模式)
方法调用 调用该方法的对象
构造函数调用 新建的实例对象
call/apply 由第一个参数决定
bind 永远绑定为 bind 第一个参数
箭头函数 外层作用域的 this

五、快速记忆口诀

"谁调用指向谁,箭头外层定乾坤,

call/apply 说改谁,bind 一锤定终身。"

相关推荐
程序员黑豆4 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
bugcome_com7 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
To_OC7 小时前
写了三天 Next.js,我的 React 世界观被拆了又装回去
前端·全栈·next.js
独泪了无痕7 小时前
viewer.js 安装与配置指南:实现图片预览功能
前端·vue.js
起床学FPGA9 小时前
AI回答问题之后,会自动跳到最下面的问题
开发语言·javascript·ecmascript
Fluxart.ai9 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
why技术10 小时前
AI 写的文章,可能都带着手敲一遍都去不掉的“隐形水印”。
前端·人工智能·后端
愚公搬代码10 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
CodeSheep10 小时前
又一个华为天才少年,离职了!
前端·后端·程序员
kyriewen10 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试