javascript内call()、apply()、bind()方法的作用

1.call()、apply()、bind()这三个方法均可改变this的指向

可以看下面的例子:

var name = '小王',age= 16;
var obj = {
	name: '小张',
	objAge: this.age,
	myFun: function(){
		return this.name+"年龄"+this.age;
	}
}
var db = {
	name: '小明',
	age: 22
}
console.log(obj.objAge);   //16
console.log(obj.myFun());  // 小张年龄undefined
console.log(obj.myFun.call(db));    //小明年龄22
console.log(obj.myFun.apply(db));    //小明年龄22
console.log(obj.myFun.bind(db)());   //小明年龄22
// bind 执行需要再带一个小括号  是执行操作

可以看到,在未添加这三个方法前:obj内年龄属性没有值,this指向的是obj,因为obj没有值,所以是undefined。

在添加了三个方法后,可以看到获取数据的指向均发生改变。

2.call 、bind 、 apply 传参情况

var obj = {
	name: '小张',
	objAge: this.age,
	myFun: function(fm, to){
		return this.name+"年龄"+this.age ,"来自"+fm + "去往"+to;
	}
}
var db = {
	name: '小明',
	age: 22
}
console.log(obj.myFun.call(db,'成都','上海'));     //小明 年龄 22  来自 成都去往上海
console.log(obj.myFun.apply(db,['成都','上海']));        //小明 年龄 22  来自 成都去往上海  
console.log(obj.myFun.bind(db,'成都','上海')());         //小明 年龄 22  来自 成都去往上海
console.log(obj.myFun.bind(db,['成都','上海'])());   //小明 年龄 22  来自 成都,上海去往undefined

从上面四个结果不难看出

    call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

    call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面  obj.myFun.call(db,'成都', ... ,'string' );

    apply的所有参数都必须放在一个数组里面传进去  obj.myFun.apply(db,['成都', ..., 'string' ]);

    bind除了返回是函数以外,它 的参数和call 一样。

    

    当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!

bind()方法

this.name="jack";
var demo={
	name:"rose",
	getName:function(){return this.name;}
}
 
console.log(demo.getName());//输出rose 这里的this指向demo
 
var another=demo.getName;
console.log(another())//输出jack 这里的this指向全局对象
  
//运用bind方法更改this指向
var another2=another.bind(demo);
console.log(another2());//输出rose 这里this指向了demo对象了

js bind的多次绑定只有第一次是有效的

var getname = function(){console.log(this.name)};
var m = getname.bind({name:'q1'}).bind({name:'q2'});
m();   // q1

参考:javascript中call()、apply()、bind()的用法终于理解

          浅谈js中的bind

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值