1. call方法
1. 可以让一个对象去使用另一个对象的方法
比如
function clg1(){
console.log(clg1)
}
function clg2(){
console.log(clg2)
}
clg2.call(clg1)//打印出来的是clg2
是由clg1去调用了clg2 这个函数,this指向clg1
再来一个
function add(a,b){
return a+b
}
function sub(a,b){
return a-b
}
console.log(add.call(sub,3,1))//打印4
使用sub去借用了add这个函,this指向了sub
再比如用伪数组去借用数组的方法
var obj={
0:'a',
1:'b',
2:'c',
length:3
}
Array.prototype.push.call(obj,'d','e','f')
console.log(obj)//d e f都加入进去了,且length也变为了6
obj=Array.prototype.slice.call(obj)//slice方法是将数组提取出来,如果不赋值obj还是原来的类型
console.log(obj)//此时obj已经变为真数组
call方法是一个个的接受参数,而apply方法接受的是数组类型的参数,如果要使用的是数组而不是参数列表,apply方法更方便
2.apply方法
还是上面3个示例,使用apply方法来实现
function clg1(){
console.log(clg1)
}
function clg2(){
console.log(clg2)
}
clg1.apply(clg2)//和上面效果相同
function add(a,b){
return a+b
}
function sub(a,b){
return a-b
}
console.log(add.apply(sub,[3,1]))//此时需要传入的参数是数组
var obj={
0:'a',
1:'b',
2:'c',
length:3
}
Array.prototype.push.apply(obj,['d','e','f'])//参数为数组
console.log(obj)//d e f都加入进去了,且length也变为了6
obj=Array.prototype.slice.apply(obj)//slice方法是将数组提取出来,如果不赋值obj还是原来的类型
console.log(obj)//此时obj已经变为真数组
call&&apply的使用场景
参数比较少的情况,使用call比较方便
参数已经放在一个数组或者是伪数组中,就使用apply