JS之apply&call&bind基本介绍

160 阅读2分钟

这是我参与更文挑战的第23天,活动详情查看: 更文挑战

call,apply,bind是挂在Function对象上的三个方法,意味着调用这三个方法的必须是一个函数

三个函数的基本语法

function.call(thisArg,param1,param2,...)
function.apply(thisArg,[param1,param2,...])
function.bind(thisArg,param1,param2,...)

function代表的是要调用的参数,thisArg是this所指的对象,后面的param1,param2...是function的参数,如果function没有参数,那么后面的param1,param2等可以不写。

三个方法的相同点就是:都可以改变函数function的this指向。

显而易见,call和apply的区别在于call的第二个到第N个都是function的参数,而apply的第二个参数是一个数组。

而bind和另两个(call以及apply)不同,bind也可以改变function的this指向,但是不是马上执行,而call和apply是改变了函数的this指向之后马上执行。

这个通过一个代码进行演示,有两个人A和B是好朋友,有一天B想看个电视剧,刚好A有个视频会员,B就寻思借一下A的视频会员。

let A = {
	name:"aaa",
	Login:function(){
		return this.name+"用aaa的账户登陆成功"
	}
}
let B = {
	name:"bbb"
}
console.log(A.Login())//aaa用aaa的账户登陆成功
console.log(A.Login.call(B,'bbb'))//bbb用aaa的账户登陆成功
console.log(A.Login.apply(B,['bbb']))//bbb用aaa的账户登陆成功
let borrow = A.Login.bind(B,'bbb')
console.log(borrow())//bbb用aaa的账户登陆成功

可以看到call,apply,bind都能实现我们想要的目标,通过改变this的指向,让B对象可以复用A对象的方法,从而达到A用自己的账号登录就显示的aaa用aaa的账户登陆成功,改变this指向后就显示bbb用aaa的账户登陆成功

判断数据类型。用typeof和Object.prototype.toString 来判断所有的数据类型是最合适的。

function getType(obj){
	let type = typeof obj
	//如果是原始类型就直接返回
	if(type !== "object"){
		return type
	}
	//不是原始类型就按照正则返回对象对应的类型
	return Object.prototype.toString.call(obj).replace(/^$/,'$1')
}

这个方法就是采用了call借用的思路,判断类型就是借用了Object的原型链上的toString方法,返回判断传入的obj的字符串来判断对象类型具体的数据类型。