我们都单独见过以下两种情况
第一种
fn.apply(obj, args)
fn代表一个函数对象;
obj代表函数调用过程中,内部的this所指向的对象;
args是一个数组或者类数组, 代表在函数调用时传递给函数的参数;
第二种
fn.call(obj, arg1, arg2, ……)
fn代表一个函数对象;
obj代表函数调用过程中,内部的this所指向的对象;
arg1, arg2, ……, 是一个一个独立的参数, 代表在函数调用时一一对应的传递给函数的参数;
理解了上面的两种情况,Function.prototype.apply.call(fn, obj, args)就好理解多了
首先,Function.prototype.apply.call()代表对函数的原型对象的apply方法利用call方法进行绑定,因为Function.prototype.apply本身也是函数,也是可以进行绑定函数执行过程中this的指向的, 因为call本身可以传递多个参数:
第一个参数fn,代表apply函数内部的this的指向,就相当于是fn直接调用了apply方法,那这个作用就和fn.apply()的作用一摸一样了
接下来,继续传入两个参数,一个对象obj,和 一个数组或类数组对象args, 那这个作用岂不是就是和fn.apply(obj, args)一模一样了
这样看下来是不是很好理解,但是到这里大家可能不禁要问,既然fn.apply(obj, args)的效果Function.prototype.apply.call(fn, obj, args)一样, 和为什么已经还要搞得这么复杂用Function.prototype.apply.call(fn, obj, args)呢?
其实很简单就是说,如果你用fn.apply(obj, args)时,是不是需要考虑该函数对象有没有已经自己定义了一个apply函数呢? 如果是的话,那么当调用apply的时候,它就不会顺着原型链向上层找了,而是就地取材,那么此时如果还想用apply改变this指向就用用Function.prototype.apply.call(fn, obj, args)了。
理解了Function.prototype.apply.call(fn, obj, args),大家能不能一次类推理解一下Function.prototype.call.call(fn, obj, arg1, arg2, ……)呢,道理是一样的,发动你的智慧吧, 加油!