apply,call,bind

js中call、apply和bind的异同点

js中的this指向是灵活多变的,有的时候我们需要改变this的指向,这个时候就要用到call()、apply()或者bind()方法。

1、call

先看看下面的例子:

let xiaoming = {
    name:'xiaoming'
};
let lihua = {
    name: 'lihua',
    foo:function (){
        console.log(this.name);
    }
};

lihua.foo();//lihua
lihua.foo.call(xiaoming);//xiaoming

正常情况下,lihua.foo()中的this就是指向lihua,当我们使用了call()方法后,this的指向改变了,改成了xiaoming。

call()方法还可以传入参数:

let xiaoming = {
    name:'xiaoming'
};
let lihua = {
    name: 'lihua',
    foo:function (age,sex){
        console.log(this.name +' is a ' + age + "-year-old " +sex);
    }
};

lihua.foo.call(xiaoming,15,'boy');//xiaoming is a 15-year-old boy

2、apply

apply()与call()用法基本一致,不同的是,call()传参数时,使用的是参数列表:call(obj,param1,param2…),而apply()传参数时候使用的是数组:apply(obj,array),例子如下:

let xiaoming = {
    name:'xiaoming'
};
let lihua = {
    name: 'lihua',
    foo:function (age,sex){
        console.log(this.name +' is a ' + age + "-year-old " +sex);
    }
};

let arr = [15,'boy'];
lihua.foo.apply(xiaoming,arr);//xiaoming is a 15-year-old boy
lihua.foo.apply(xiaoming,[15,'boy']);//与上面等价

3、bind

bind()和call(),apply()的区别就比较明显了,call()和apply()是直接调用,而bind()则是返回一个函数:

let xiaoming = {
    name:'xiaoming'
};
let lihua = {
    name: 'lihua',
    foo:function (age,sex){
        console.log(this.name +' is a ' + age + "-year-old " +sex);
    }
};

lihua.foo.bind(xiaoming,15,'boy');//函数没调用
lihua.foo.bind(xiaoming,15,'boy')();//xiaoming is a 15-year-old boy

由于bind()返回的是一个函数,所以可以在函数调用时传参:

let test = lihua.foo.bind(xiaoming);
test(15,'boy');//xiaoming is a 15-year-old boy

4、总结

1、call()、apply()和bind(),都可以用来改变this的指向。

2、它们三个的第一个参数都是this要指向的对象。

3、它们三个都能传参数,call()和bind()传的是参数列表,apply()传的是数组。

4、call()和apply()是直接调用,bind()返回的是函数,可以在后面需要时再调用,所以也可以在调用的时候再传入参数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值