call()和apply()作用都是改变对象的执行上下文,也就是函数中this的指向。
JavaScript中this的指向。
首先明确两个概念,函数和方法:
函数:当一个函数不是一个对象的属性时,我们称之为函数。
方法:当一个函数被保存为对象的一个属性时,我们称之为方法。
1.this
1.函数调用模式:this指向window;
2.方法调用模式:this指向调用当前方法的对象;
3.构造函数调用模式:如果函数是new调用的,此时this指向创建出来的新对象上;
4.上下文调用模式:也就是本文的call和apply,可以指定这个函数的this指向;
5.bind:创建一个新的函数,可以绑定新的函数的this指向,当绑定了新函数的this指向后,无论使用何种调用模式,this都不会改变。
参数:新函数的this指向;
返回值:新的函数。
var newFn=fn.bind(window);将新数组的this指向了window
2.call
1.释义:可以调用一个函数,并且可以指定这个函数的 this 指向。
2.参数:
参数一,指定函数内部的 this 指向,不传默认为window;
参数二,接收若干个参数,这些参数将会作为function的参数传入function;
fn.call(thisArg,arg1,arg2,arg3);==fn(arg1,arg2,arg3)
3.apply
1.释义:可以调用一个函数,并且可以指定这个函数的 this 指向。
2.参数:
参数一,指定函数内部的 this 指向,不传默认为window;
参数二是数组或者伪数组,里面存放了所有的参数列表。(这也是call和apply的区别)
apply有一个特性,平铺特性,apply会把数组里面的每一项都当成参数传入函数。
fn.apply(thisArg,[arg1,arg2,arg3]);==fn(arg1,arg2,arg3)
call 和 apply 和 bind :
三者都可以把一个函数应用到其他对象上,注意不是自身对象。apply,call 是直接执行函数调用, bind 是绑定,执行需要再次调用.
apply 和 call 的区别是 apply 接受数组作为参数,而 call 是接受逗号分隔的无限多个参数列表
补充:伪数组
1.伪数组其实就是一个对象,但是跟数组一样,伪数组也会有length属性,也有0,1,2,3等属性。
2.数组并没有数组的方法,不能使用push/pop等方法
3.数组可以跟数组一样进行遍历,通过下标操作。
4.常见的伪数组:arguments、document.getElementsByTagName的返回值、jQuery对象
5.伪数组借用数组的方法:Array.prototype/ [ ].push.call(arrLike, "赵六");
6.将伪数组转换成真数组:var arr = Array.prototype/ [ ].slice.call(arrLike);
网友评论