今天讲的问题比较绕,让我们先从一个题目开始:

大家可以自行运行,主要讲一下这种问题怎么分析。

问题分析

我们平常用的apply和call大都是形如fun.call(obj,ar1,ar2,..)和fun.apply(obj,[ar1,ar2,..])这种的,表示执行fun方法的时候,obj为fun方法中的this,其他的为fun执行时的参数。

对于Function.prototype.call.apply(function(a){return a;}, [0,4,3]),我们先加上括号,搞清楚优先级:(Function.prototype.call).apply(function(a){return a;}, [0,4,3]),按照上面的思路,这个式子讲变成(function(a){return a;}).call(0,4,3),因为function(a){return a;}这个方法就替换了Function.prototype。而0,4,3就变成了call的参数。

到了这一步就简单了,(function(a){return a;}).call(0,4,3) 表示内部的this为Number(0),执行方法的参数为4和3,因此a为4。

同理,还有一个与之等价的式子:Function.prototype.apply.call(function(a){return a;}, 0,[4,3]);同样,第一步加上括号,变成(Function.prototype.apply).call(function(a){return a;}, 0,[4,3]),然后整个式子变成(function(a){return a;}).apply(0,[4,3]),同样,Number(0)为function(a){return a;}中的this,数组中的4,3变成了参数,因此a还是4。

总结

上面分析完之后,我们发现其实fun.apply(obj,[ar1,ar2,..])的完整写法为Function.prototype.apply.call(fun,obj,[ar1,ar2,...]);fun.call(obj,ar1,ar2)的完整写法为Function.prototype.call.apply(fun,[obj,ar1,ar2,...])。其实它们是一样的东西。

为什么要讲这个东西?因为es6中的Reflect.apply(func, thisArg, args)方法等同于Function.prototype.apply.call(func, thisArg, args),因此我们要搞懂这些看似复杂的东西到底代表什么东西,方便我们的学习。

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字