JavaScript call、apply、bind 详解

前言

call、apply、bind是 JavaScript 中用来显式改变this的三个常用方法。 它们既是开发中常见工具,也是面试高频考点。


一、为什么需要 call、apply、bind?

有时候我们希望一个函数在执行时,this指向指定对象。

例如:

javascript 复制代码
function say() {
  console.log(this.name);
}

const obj = {
  name: 'Tom'
};

如果直接调用:

scss 复制代码
say();

此时this不会指向obj。所以我们需要:

ini 复制代码
say.call(obj);

二、call

call会立即执行函数,并且第一个参数就是指定的this。

javascript 复制代码
function say(age) {
  console.log(this.name, age);
}

const obj = { name: 'Tom' };

say.call(obj, 18); // Tom 18

三、apply

apply和call类似,也会立即执行函数。区别在于参数形式不同:

  • call:一个一个传参数

  • apply :参数放在数组里传

arduino 复制代码
function say(age, city) {
  console.log(this.name, age, city);
}

const obj = { name: 'Tom' };

say.apply(obj, [18, 'Beijing']); // Tom 18 Beijing

四、bind

bind不会立即执行函数,而是返回一个新的函数,这个新函数的

this已经被绑定好了。

ini 复制代码
function say(age) {
  console.log(this.name, age);
}

const obj = { name: 'Tom' };

const fn = say.bind(obj, 18);
fn(); // Tom 18

五、三者区别总结

相同点

  • 都可以改变函数执行时的 this

不同点

call

  • 立即执行
  • 参数逐个传

apply

  • 立即执行
  • 参数数组传

bind

  • 不立即执行
  • 返回新函数

六、常见使用场景

1)借用方法

ini 复制代码
const arrLike = { 0: 'a', 1: 'b', length: 2 };
const arr = Array.prototype.slice.call(arrLike);

console.log(arr); // ['a', 'b']

2)绑定 this

javascript 复制代码
const obj = {
  name: 'Tom',
  say() {
    console.log(this.name);
  }
};

setTimeout(obj.say.bind(obj), 1000);

七、总结

call、apply、bind的核心作用就是:

显式指定函数执行时的 this。

记忆口诀:

  • call :立即调用,参数逐个传

  • apply:立即调用,参数数组传

  • bind:不立即调用,返回新函数

相关推荐
杨杰3985 分钟前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript
只睡四小时1 小时前
AI 生成 PPTX:11 页课件编译出 429 个形状
javascript·python·pptx·ai生成ppt·ooxml
shmily麻瓜小菜鸡2 小时前
Axios 中 params 与 data 的区别与原理
javascript·typescript
isha2 小时前
Univer拆解——从类与方法的视角分析
前端·javascript
变与不变8062 小时前
GET请求知识详解
前端·javascript
哎哟喂呢哈4 小时前
VedioJS 10
javascript·html5
夏幻灵12 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
三天不学习13 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs1940514 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
小宋102119 小时前
A2UI从零实战:Agent安全生成交互界面与事件回传
javascript·人工智能·安全·交互