call() 和 apply()的作用
① 它们都可以修改函数中的 this指向
② 可以借用其他对象的方法
我们举个栗子来说明它的这两个作用
// 修改函数内部 this 的指向
function example(){
console.log(this);
}
example(); // 打印出的this值是 window
var obj = {
"name":"xiaoyan",
"age":23
}
example.apply(obj); //打印的this 为Object
example.call(obj); //打印的this 为Object
稍后再来看它是如何借用其他对象的方法的,在此之前,先看看它们接收参数的问题
call() 和 apply 可以接收参数
① 对call() 来说,接收参数的格式为:
call(对象,参数1,参数2,......)
② apply() 接收参数的格式为:
apply(对象,[参数1,参数2,......])
所以,call() 和 apply() 应用的场景有所不同,
call 适合于参数个数已知的情况下,当参数个数不确定时,需要使用apply来实现。
在此,利用它们可以接收参数的属性来实现借用其他对象的方法的作用 //参数个数已知,实现借用sum的方法
function sum(a,b){
return a*b+a;
}
var result= sum.call(obj,10,20);
var result= sum.apply(obj,[10,20]);
console.log(result); // 210
当传入参数的个数未知时,可以使用apply来实现
function sum(){
return arguments[0]*arguments[1]+arguments[2];
}
var result= sum.apply(obj,[1,2,3]);
console.log(result); // 5
其实call() 和 apply() 在参数方面还有一个不同点,就是期望的形参长度不一样
通过使用下面的方式就可以查看期望参数的长度
函数.length
利用apply 实现伪数组转真数组
其实实现伪数组转真数组十分的简单,就一句代码就可以实现,请看下面代码
var obj = {0:"name",1:"age",length:2}; //伪数组
var arr =[]; // 空数组
[].push.apply(arr,obj);
console.log(arr); //打印结果: ["name", "age"]
伪数组转真数组的实现,需要对前面我们写的两点进行理解,这里也进行进一步的解释:
① 前面我们知道了,谁调用方法,方法内部的 this 就指向谁,
② 注意 [].push 并不是调用push方法,而是找到 push方法
③ push.apply(arr,obj) ,将伪数组 obj 传递给了push方法 ,apply方法内部会自动取出伪数组的每一项传递给push 方法,可以理解为依次将伪数组中的元素push到了arr中
利用apply 实现真数组转伪数组
var arr =["xiaoyan","zhongxi","minglang"];
var obj={};
[].push.apply(obj,arr);
console.log(obj); // {0: "xiaoyan", 1: "zhongxi", 2: "minglang", length: 3}