搞一搞 apply、call和 bind
在刚开始写代码的时候,总是会遇到些call或者apply的代码,面试的时候总是会遇到些call和apply的问题,这会呢我们扯一下call、apply和bind(bind一般会放到下一个阶段问),省的我们到时候知道怎么用,怎么玩,但是吹不出来。
其实简单说呢,这三个玩意都是改变函数方法里的this的指向问题,一般来说呢this指向就是谁调用它它指向谁,而且指向它的上一级的最近的一个对象,但是构造函数呢里面的this就不听话了,它指向于根据构造函数新建的对象(当然一般可以这么理解,具体了解的话可以查看js高程三里一章关于上下文的问题的内容)。当构造函数中return一个对象的时候,新建对象里this的指向就会发生改变,确定的说这个构造函数本身的就发生了改变,this指向返回的对象,但是返回的是简单数据类型,那么this的指向就不变。
call和apply的使用方法呢,大抵相同,都是fn.call(obj,arg1,arg2...)/fn.apply(obj,[...arguments]),其中呢obj就相当于fn指向的新的对象,也可以理解为fn直接成为obj的一个方法,带的那些参数就用于方法的执行的参数,只不过是call之后参数是一个接一个,而apply之后是一个数组形式的。注意:如果obj是一个null的话,那么this就指向window。call和apply执行之后的方法都是立即执行。
接下来说一下bind,bind呢也可以用来改变this的指向,bind的操作方式和call差不多后面跟参数,但是bind返回的是一个函数,这个函数不会立即执行,只有在调用的时候执行,而且在调用的时候还可以再次放入参数,但是参数的执行只能按照形参一个一个来,至于call和apply搞出来的直接执行的函数只能在当时插入参数。
接下来就是使用,关于这三个玩意的使用,全看你自己的业务或者奇思妙想,只要玩的开,啥都能搞。