美文网首页
自己实现一个apply方法

自己实现一个apply方法

作者: 中华田园柴 | 来源:发表于2022-11-26 13:48 被阅读0次

        我们要自己实现一个apply方法,我觉得最终的代码并不重要,关键是实现这个方法的思路,掌握了思路,才算是学到了真正的知识,并能够把这种思考方式用到其他地方。

    1.apply方法是什么

        apply是js中函数的自带方法,可以在指定函数this指向的情况下,执行函数,并传递参数

    2.方法应该放在哪?接收那些参数?

    Function.prototype

        由上面的分析可知,apply属于的自带方法,js中的每个函数都可以执行此方法,因此这个方法,应该是绑定到Function构造函数的原型上。apply方法可以接收两个参数,第一个参数是this的指向对象,另外一个参数就是函数执行时,接收的参数。由此分析,我们可以得到如下的代码

    arguments

        可以看到代码中出现了arguments变量,这个不做过多解释,可以网上搜一搜。在这里想说的是要熟悉这个用法,因为很多时候我们写的函数,不能确定在函数执行的时候,最终会接收多少个参数,这个时候用arguments就可以在编写函数的内部代码时,提前拿到将来函数执行时,可能会被传入的所有参数,做相应处理

    3.如何决定this的指向

        我们知道this的指向是在函数执行的时候才决定的,具体指向简单来说就是这个函数是由哪个对象来调用的,执行时函数内部的this就指向这个对象。比如obj.fn(),fn函数是通过obj对象来调用的,fn函数执行时,this就指向obj对象。因此可以想到,如果想决定一个函数的this指向,那就要把这个函数变为该对象的方法,然后通过对象来调用这个函数,因此我们可以得到如下代码

     这里面还有个细节,就是为什么直接让fn(fn是随便起的函数名,最后会被删掉。关键是这个fn属于context对象的方法,通过context来调用fn)等于this。这其实是涉及到构造函数和原型的知识了,简单说下,我们知道用new关键字执行构造函数,可以得到一个实例对象,那么在编写构造函数代码的时候,总得有个方法能够拿到那个还未出现的未来的实例对象吧,这样我们才能对实例对象进行一些属性和方法的添加,而这个方法,就是this,也就是说构造函数内部的this,就指向未来的实例对象。那构造函数上的原型对象,也是同理,原型对象中的方法,也是需要能够拿到未来的实例的,那同样也是通过this拿到。回到上面的代码,函数本质上也是对象(js中其实一切皆对象),函数的构造函数是Function,我们写的Function.prototype.apply2方法,即是原型对象中的方法,那么在apply2内部,this指向的就是未来的那个执行函数,我们在学习原型这块知识的时候,对于this的使用可能简单了解一下就略过了,没有想到真正的用法是这样的(反正我是没想到)

    4.如何把数量不固定的参数传递给一个函数,并执行这个函数

    这里就需要用到eval函数。eval函数计算 JavaScript 字符串,并把它作为脚本代码来执行。我们可以打印一下把数组转换为字符串之后的结果,会发现打印结果就是把数组的中括号去掉后的元素的字符串,元素之间还是用逗号连接,这种形式恰好就是函数执行时,实参的传递形式。因此我们可以得到最终版的代码

    相关文章

      网友评论

          本文标题:自己实现一个apply方法

          本文链接:https://www.haomeiwen.com/subject/ffccfdtx.html