浅谈call、apply和bind

定义

call() :

使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

apply() :

调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

bind():

创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

分析:

先上栗子

var module = {
  x: 42,
  getSite: function(y, z) {
	console.log(this);
    return `${this.x},${y},${z}`;
  }
};

var getSiteCopy = module.getSite;

console.log(getSiteCopy(142, 21)); // undefined,142,21

console.log(getSiteCopy.call(module, 142, 21)); // 42,142,21

console.log(getSiteCopy.apply(module, [142, 21])); // 42,142,21

var getSiteBind = getSiteCopy.bind(module, 142, 21);
console.log(getSiteBind ()); // 42,142,21

运行截图

在这里插入图片描述
接下来针对这个栗子进行分析

相同点:

call()、apply()、bind()三者,都是可以对一个函数指定this值,并且可以提供参数。

console.log(getSiteCopy(142, 21)) // undefined,142,21

因为这里getSiteCopy(142, 21)的执行环境是window,window中获取不到this.x,所以结果为undefined。

console.log(getSiteCopy.call(module, 142, 21)); // 42,142,21
console.log(getSiteCopy.apply(module, [142, 21])); // 42,142,21
var getSiteBind = getSiteCopy.bind(module, 142, 21);
console.log(getSiteBind ()); // 42,142,21

但是使用了call()、apply()、bind()就能顺利取到this.x,因为它们将this指向module了。

不同点:

call():

参数的形式是单独给出

console.log(getSiteCopy.call(module, 142, 21));

apply():
参数的形式是一个数组(或类数组对象)

console.log(getSiteCopy.apply(module, [142, 21]));

bind():
创建一个新的函数

var getSiteBind = getSiteCopy.bind(module, 142, 21);
console.log(getSiteBind ()); // 42,142,21

在了解bind()和call()/apply()的区别之后,其实我们可以使用call()/apply()来实现bind()。
详见: 使用apply(),实现bind()




ps:转载请注明出处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值