apply, call, bind在js中的区别

来源:互联网 发布:淘宝抠图出来衣服 编辑:程序博客网 时间:2024/05/18 21:47

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.jsFunction.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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 运动后小腿骨疼怎么办 用单杠练腹肌晃怎么办 一跑步小腿就紧怎么办 小腿一跑步就痛怎么办 单杠屈臂悬垂身体摆动怎么办 脸上被打了紫了怎么办 王者荣耀队友太坑怎么办 大脸不想戴泳帽怎么办 脐带掉了有血怎么办 颈椎不小心扭了怎么办 遇不到合适的人怎么办 老爸不爱吃饭身体不好怎么办 小朋友在日本旅游生病怎么办 小朋友不吃饭装生病怎么办 带小朋友去苏梅岛生病了怎么办 练完舞蹈腿疼怎么办 过度运动后肌肉特别酸痛怎么办 锻炼把脚扭伤了怎么办 生完孩子变胖了怎么办 喝了啤酒肚子撑怎么办 小孩把口香糖吞进肚子怎么办 臂力器手柄坏了怎么办 30臂力棒掰不动怎么办 杯子盖子拧紧了打不开怎么办 深蹲以后腿软怎么办 小孩摔跤破皮了怎么办 手机qq账号密码忘了怎么办 刚满月宝宝喷奶怎么办 两个月的宝宝不爱吃奶怎么办 仓鼠走路画圈了怎么办 力气大但扳手腕不行怎么办 只睡了两个小时怎么办 微博账号被冻结了怎么办 微博一天多次解冻怎么办 肿瘤对化疗不敏感怎么办 2个月宝宝肺炎怎么办 小孩咳嗽2个月怎么办 两个月的小孩子气管炎怎么办? 小孩子两个月发烧38度怎么办 两个月的小孩子咳嗽怎么办 5个月宝宝吃奶少怎么办