javascript中call()、apply()、bind()的用法

1、首先看下下面的例子:

例1:

var name='张三' ,age=18;
var obj={
	name: '李四',
	objAge:this.age,
	myFun: function({
		console. log( this.name +"年龄"+this.age );
	}
}

  obj.objAge;  //18
  obj.myFun()  //李四年龄undefined

在对象里面,如果是函数里面的this,那么谁调用指向谁,如果不是在函数里面的,那么this指向的是window。

例2

var name='热巴';
function shows ( ){
	console.log (this.name ) ;
}

 shows()  //热巴 

比较一下这两者this 的差别,第一个打印里面的this 指向obj,第二个全局声明的shows()函数 this 是window ;

2、call()、apply()、bind() 都是用来重新定义 this 这个对象的

如:

var name='张三' ,age=18;
var obj={
	name: '李四",
	objAge:this.age,
	myFun: function(){
		console. log( this.name + "年龄" +this.age );
	}
}
var name2={
	name: '热巴",
	age: 19
}

结果:

    obj.myFun.call(name2);    //热巴年龄19
    obj.myFun.apply(name2);    //热巴年龄19
    obj.myFun.bind(name2)();   //热巴年龄19

小贴士
以上的bind 方法后面多了个 () 外 ,其他返回结果都一致。由此得出结论,bind 返回的是一个新的函数,必须调用它才会被执行。

3、对比call 、bind 、 apply 传参情况下有什么不同呢?
直接通过代码研究一下:

var name='张三',age=18;

var obj={
	name: '李四',
	objAge:this.age,
	myFun: function(a,b){
		console.log( this.name + ”年龄" + this.age ,"从"+ a+"去往"+ b );
	}
}

var name2={
	name:'热巴',
	age:19
}

  obj.myFun.call(name2,'广州','深圳');   //热巴 年龄 19  从 广州去往深圳
  obj.myFun.apply(name2,['广州','深圳']);        //热巴 年龄 19  从广州去往深圳
  obj.myFun.bind(name2,'广州','深圳')();         //热巴 年龄 19  从广州去往深圳
     obj.myFun.bind(name2,['广州','深圳'])();   //热巴 年龄 19  从广州,深圳去往undefined

注意事项
从上面四个结果不难看出:

  • call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数就有明显的差别。
  • call的参数是直接放进去的,第2…n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,‘广州’, … ,‘string’ );
  • apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,[‘广州’, …, ‘string’ ]);
  • bind除了返回是函数以外,它的参数类型和call一样,并且如果写成数组的话,那么它会将该数组直接赋值给一个参数,后面的参数全都因没传值,输出undefined。
  • 另外,这三个函数的参数类型不仅仅可以是string类型,还允许是其他各种类型,包括函数 、 object 等。

4、在vue项目中,为了提高项目的性能,防止页面刷新过多,可通过防抖函数解决过度刷新影响性能的问题,这里面就会用到apply。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值