深入谈谈apply和call

这篇文章是本小猿生写的第一篇文章,不喜就喷,还望大佬批评指教,共同进步,好了废话不多说,下面开始胡扯。

先带大家复习一下apply和call

apply和call方法的相同点

  • apply()call()方法的作用都是改变this 的指向,也是他们的相同点

apply和call方法的不同点

  • apply()call() 方法的区别在于 接收参数的方式不同
    • apply() 方法,两个参数,
      第一个参数是this修改后的指向
      第二个参数是一个数组
    • call() 方法,
      第一个参数是this修改后的指向 与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"]
			

第一次水贴,欢迎大佬来踩,批评指正,共同进步,不喜就喷 谢谢!!!

猜你喜欢

转载自blog.csdn.net/weixin_44716659/article/details/108595365