apply, call, bind在js中的区别

apply, call, bind在js中的区别

在js中,这三种方法都是用来改变函数的this对象的指向的。

先看看相似点

  • 都是用来改变函数的this对象的指向的
  • 第一个参数都是this要指向的对象
  • 都可以继续传递参数

那区别呢?
上代码:

var xb = {
    name: '小冰',
    gender: '女',
    say: function(){
        alert(this.name + ',' + this.gender);
    }
}
var other = {
    name: '小东',
    gender: '男',
}
xb.say();   ===> 结果    小冰,女

那么如果我们想要用xb的say()方法输出other的数据,要怎么办呢?
简单的可以用:

1.   xb.say.call(other);
2.   xb.say.apply(other);
3.   xb.say.bind(other)();

由上面代码我们可以看到,其实call和apply方法,都是对函数的直接调用,但是bind()方法需要加上()来执行


现在来看传参数的情况

上代码(还是上面的例子,但是传参):

var xb = {
    name: '小冰',
    gender: '女',
    say: function(school,grade){
        alert(this.name + ',' + this.gender + '----' + school + ',' + grade);
    }
}
var other = {
    name: '小东',
    gender: '男',
}
  • 用call()传参调用
xb.say.call(other,'斯坦福','3')
//  ====>  小东,男----斯坦福,3
  • 用apply()传参调用
xb.say.apply(other,['sitanfu','third']);
//  ====>  小东,男----sitanfu,third

从这里我们可以看到,其实,call()和apply()函数的用法其实是一样的,只是传参的形式不一样,这是他们最大的差别


bind()呢?

xb.say.bind(other,'斯坦福','3');
//  是不是跟call传参很像

但是上面xb.say.bind(other,’斯坦福’,’3’),返回的其实还是一个函数,并没有执行

 console.log(xb.say.bind(other));      // 我们可以把xb.say.bind(other);打印出来看看
 //    ===> 返回的是一个函数  返回放在下一节代码里面
}

返回结果

function(school,grade){
    alert(this.name + ',' + this.gender + '----' + school + ',' + grade);

所以要执行,需要在xb.say.bind(other)后面加()让其执行。执行结果如下:

 console.log(xb.say.bind(other))('斯坦福','3');
 //  ==>  小东,男---斯坦福,3

这里附加bind的源码实现:

// the .bind method from prototype.js
Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments),object = args.shift();
    return function(){
        return fn.apply(object,args.concat(Array.prototype.slice.call(arguments)));
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值