这篇文章是本小猿生写的第一篇文章,不喜就喷,还望大佬批评指教,共同进步,好了废话不多说,下面开始胡扯。
先带大家复习一下apply和call
apply和call方法的相同点
- apply()和call()方法的作用都是改变this 的指向,也是他们的相同点。
apply和call方法的不同点
- apply() 和 call() 方法的区别在于 接收参数的方式不同
- apply() 方法,两个参数,
第一个参数是this修改后的指向。
第二个参数是一个数组。 - call() 方法,
第一个参数是this修改后的指向 与apply 的方法的第一个参数相同。
后面要传递给函数的参数与apply方法不同,需要逐一列举出来。
- apply() 方法,两个参数,
- 避免语言晦涩,如下代码做出解释:
var obj={
"name":"xpc"};
function test(a,b){
console.log(a+b);
console.log(this)
}
test(1,1) //2 window 调用该函数原this指window
test.apply(obj,[1,2]); // 3 {name: "xpc"} 调该函数this被修改为自定义的obj
test.call(obj,1,2) // 3 {name: "xpc"} 调该函数this被修改为自定义的obj
// 1. 通过window,找到test方法
// 2. 通过apply或者call方法将test函数内部的this修改为自定义的obj对象。
深入谈谈apply和call用法
上面给大家又讲解了一下,apply()和call()的用法。其实在实际的开发中很少会去用它仅仅改变this的指向,而是利用apply和call方法做真伪数组的切换。
var arr=[1,3,5,7,9];
var obj={
};
console.log(obj); // {}
//1.通过[]找到数组的push方法
//2.通过apply(obj)方法,找到push内部的this,修改为自定义的this指向
//3.将传入数组中的元素依次取出,传递给了push方法
[].push.apply(obj,arr);
console.log(obj) // {0: 1, 1: 3, 2: 5, 3: 7, 4: 9, length: 5}
其实真伪数组的切换apply方法都可以完成的,但是总有某Low b浏览器暗度陈仓,当面一套背后一套,8版本及其以下版本报错,为了兼容只好使用新的方法。
var obj={
0: "xpc", 1: "18", length: 2};
var arr=[].slice.call(obj);
//1.通过[]找到数组的slice方法;
//2.通过call(obj)方法,找到slice内部的this,修改为自定义的this指向
//3.因为没有给slice传参,slice会把this里的每一个元素放到一个新的数组原样返回
//slice方法不了解的,去看下js,这里我就不做过多赘述。
console.log(arr);//["xpc", "18"]
第一次水贴,欢迎大佬来踩,批评指正,共同进步,不喜就喷 谢谢!!!