返回

手写篇:Call、Apply、Bind三大技巧!掌握这些,吊打面试官

前端

开篇
当面试官问你:“手写一个Call函数”,作为程序员的你,是否会陷入尴尬的局面?现在拿起你的键盘,让我们一起走进Javascript世界的Call、Apply、Bind函数之旅,准备好了吗?

Call函数
首先,我们来认识一下Call函数。Call函数可以将一个函数指定到一个对象上执行,传入的第一个参数是this,而call函数的其余参数将作为函数的参数。我们先直接来看看代码:

function fn() {
  console.log(this);
}

fn(); // 输出:Window {}
fn.call({}); // 输出:{}

我们先定义了一个fn函数,当我们直接调用fn()时,this的指向为Window,也就是全局对象。当我们使用fn.call({})调用fn函数时,this的指向被显式地指定为一个空对象,因此输出结果为一个空对象。

Apply函数
接下来,我们来看一下Apply函数。Apply函数与Call函数非常相似,不同之处在于,Apply函数接受一个数组作为第二个参数,而Call函数接受多个参数。换句话说,Apply函数可以将一个数组展开为函数的参数。

function fn() {
  console.log(this);
}

fn(); // 输出:Window {}
fn.apply({}); // 输出:{}
fn.apply({}, []); // 输出:{}

我们定义了一个fn函数,当我们直接调用fn()时,this的指向为Window,也就是全局对象。当我们使用fn.apply({})调用fn函数时,this的指向被显式地指定为一个空对象,因此输出结果为一个空对象。当我们使用fn.apply({}, [])调用fn函数时,this的指向仍然为一个空对象,因为第二个参数是一个空数组,没有传入任何参数。

Bind函数
最后,我们来认识一下Bind函数。Bind函数可以将一个函数绑定到一个对象上,返回一个新的函数。当我们调用这个新的函数时,this的指向将被绑定到绑定函数的那个对象。

function fn() {
  console.log(this);
}

const boundFn = fn.bind({});
boundFn(); // 输出:{}

我们定义了一个fn函数,当我们直接调用fn()时,this的指向为Window,也就是全局对象。当我们使用fn.bind({})将fn函数绑定到一个空对象上后,返回一个新的函数boundFn,然后我们调用boundFn()时,this的指向就被绑定到了空对象上,因此输出结果为一个空对象。

总而言之
Call、Apply、Bind函数是Javascript中非常实用的函数,能够帮助我们在开发中解决各种各样的问题。理解和掌握这些函数的使用方法,对于我们写出高质量的代码非常重要。