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 一锤定终身。"

相关推荐
小奶包他干奶奶9 小时前
Webpack学习——Loader(文件转换器)
前端·学习·webpack
zy happy9 小时前
若依 vue3 报错:找不到模块“@/api/xxxx/xxxxx”或其相应的类型声明。。Vue 3 can not find mod
前端·javascript·vue.js
潘小安9 小时前
Git Worktree + Claude Code:让你的开发效率翻倍的秘密武器
前端
meichaoWen10 小时前
【Vue3】vue3的全面学习(一)
前端·javascript·学习
小猪努力学前端10 小时前
在 React + React Router v7 SSR 项目里做多端适配,我踩的两个坑
前端·react.js
q***d17310 小时前
React桌面应用开发
前端·react.js·前端框架
8***293110 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
0***1410 小时前
React计算机视觉应用
前端·react.js·计算机视觉
Q***K5510 小时前
React高级
前端·react.js·前端框架
c***979810 小时前
React语音识别案例
前端·react.js·语音识别