在下前端小白近日在刷各种算法/编程题目,今天碰到一编程题目考点是apply
,虽说简单但在解题时发现了一个挺有意思的东东,特来分享一下欢迎各位大佬指点~
话不哆说,直接上题目:二次封装函数
已知函数 fn 执行需要 3 个参数。请实现函数 partial调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个參数
哈哈这题简单!稍微学过js的朋友就能写出来:
这里用个call
可能会显得有点逼格(笑),当然apply
,bind
也能达到一样的效果
不多停留,我们来看下一题同样是二次封装函数:
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
唔好像也没什么难的,_arguments
就是partialUsingArguments第一个参数后的所有参数組成的数组将它和result的所有参数合并起来,利用apply
传入fnok~解决了!
诶诶?有意思的东西呢这特么一点意思都没啊。
说出来你们可能不信其实我看到这题的时候,虽然我想到了用apply
但我并没有想到fn.apply(null,newArguments)
。那我想到的是什么呢
什么鬼?我也不知道是在哪看过这东西(也许没看过)又好像是
好像都差不多,妈个鸡试试就知道了!
知道了原理(并不知道),那就好办了我给newArguments数组的头部补一个元素上去不就好了~
瀏览器一跑——没毛病老铁!
既然.call.apply
可以用,那其他3个按理来说也能用况且这里多了一步对数组的操作,能不能更优雅一点呢(另外3个怎么用,观众老爷们心里有答案吗)
本着 求知 以及 code less,do more 的精神,我对剩下的3种组合进行了深♂入的研究
原理其实很简单,Function.prototype.apply(call)
其实就是一个函數将视为一个整体,记作A原式就可以转换成:A.apply(参数)
或A.call(参数)
,然后进一步转换参数1.A(参数2)
,什么参数、参数1、参数2的
相信大家也看出來了,这里唯一的难点()就是参数。参数怎么写呢
其实很简单,apply就传数组call就传一个序列。
apply
和call
的区别大家肯定知道我就不多说了。第一个参数肯定是fn这个没跑了。关键就在第二个参数上
第二个参数,首先它形式上要看后一个apply/call
如果是apply,我们就传数组进去如果昰call,就传一个序列然后它的内容就要看A了,也就是前一个apply/call
同理,如果是apply就传数组参数,如果是call就传序列参数。
所以我们可以得出鉯下结果:
//上面3式可以实际上等于
第一次写文章(水贴)十分紧张,删了改改完了删,总觉得写的不好、十分啰嗦
可能会有人觉得毫无意义,但我觉得这个倒是可以作为一道面试题
请在填写空白内容使等式成立:
如果真的有人遇到,请回来点赞^ ^
也希望此文能多少帮助到前端新人大家一起学习,进步!
哪里要是写不好可以直说!帮助我进步谢谢!
不废话了,
完