1、apply()和call()的作用都是用于更改this,两者的使用格式如下:
apply(参数1,参数2):参数一是用于替换this的,参数二可以不用传入,一般传入数组。如果所替换this的函数需要传入参数,那么参数二数组中的元素会被依次取出当做参数传入函数中。
call(参数1,参数2,参数3….参数n):参数一是用于替换this,参数二和后面的参数用于取出当做参数传入函数中。
2、实例1:用一个对象替换函数的this。代码将obj对象的内容都替换成了this。也可以取出obj对象内部的值作为this的替换对象。
function text(){
console.log(this);//this指向调用时所在函数所绑定的对象
}
// text();//打印的结果为window,此写法类似于window.tetx(),调用的this都是window
var obj={"name":"luck"};
// text.apply(obj);//打印结果:Object { name: "luck" }
text.call(obj);//打印结果:Object { name: "luck" }
text.apply(obj.name);//打印结果:String { "luck" }
2、当需要被替换this的函数需要传入参数时,apply()和call()必须要传入多个参数作为函数的参数传入。当apply传入的第二参数为数组时,数组内部的值将会依次被取出作为函数的参数。
var obj1={};
var arr=[2,3,4];
function show(a,b){
console.log(this);
console.log(a+b);
}
// show(1,1);//打印结果为window,2
show.apply(obj1,arr);//打印结果为Object { }空对象和5,只可传入2个参数
show.call(obj1,2,2);//打印结果为Object { }空对象和4,可传入多个参数
3、此处补充push()的用法:push()内部传入的参数可以是指也可以是数组,push用于将参数插入到指定的元素中,放在元素的最后。
var obj2={};
var arr2=[1,3,5,7,9];
arr2.push(10);//直接插入值
console.log(arr2);//打印结果Array(6) [ 1, 3, 5, 7, 9, 10 ]
arr2.push(arr)//push用于插入元素,也可以直接传入值,插入的元素放在最后面
console.log(arr2);//打印结果Array(6) [ 1, 3, 5, 7, 9, (3) […],内部嵌套新的数组
4、将数组的值赋值给替换this的对象obj3,将数组的值依次取出并且传入替换的obj3对象中。下面代码被替换的this是push方法内部的this,即将后面取出的值作为push需要传入的值即push的形参,obj3作为push的this。
var obj3={};
var arr3=[1,2,3,4,5,6,7,8,9];
[].push.apply(obj3,arr3);
console.log(obj3);//打印结果为Array(5) [ 1, 3, 5, 7, 9 ]
注:上面被作为参数传入的数组是真实的数组,而传入之后给了obj3之后就变成了对象实质为伪数组,具有length属性,满足作为伪数组的条件。