javascript中的call、apply和bind的用法

call和apply

call、apply和bind都可以改变this的指向,call和apply绑定对象之后会立即执行,而bind绑定的方法需要调用才能执行。

obj.call(thisObj, arg1, arg2, ...);
obj.call(thisObj, [arg1, arg2, ...]);

两者的作用一致,都是把obj(即this)绑定到thisObj,这个时候thisObj具备了obj的属性和方法,也可以说thisObj继承obj的属性和方法。绑定后会立即执行函数。

区别:apply接受的是类数组参数,call接受的是连续参数。

示例:

function add(a, b){
    return a + b;
}
function sub(a, b){
    return a - b;
}

在控制台中运行如下:

add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8

sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2

调用原生对象的方法:

let a = {0:1, 1:"yjc", length: 2}; 

a.slice(); //TypeError: a.slice is not a function

Array.prototype.slice.call(a);//[1, "yjc"]

对象a类似Array,但是不具备array的slice等方法。使用call绑定就可以调用slice方法。

call和apply实现继承
通过call和apply,我们可以实现继承。

let Parent = function(){
    this.name = 'Lenhart';
    this.age = 25;
}

let child = {};
console.log(child); //Object {}
Parent.call(child);
console.log(child);

child继承了Parent的属性。

bind的使用

obj.bind(thisObj, arg1, arg2,...);

把obj绑定到了thisObj上,此时thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后需要调用才能执行。

add.bind(sub, 5, 3); //仅仅绑定没有调用
add.bind(sub, 5, 3)(); //8

如果bind的第一个参数是null或者undefined,等于将this绑定到全局对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值