手机版

在JS中使用apply和bind来实现作为函数或类传入的参数的动态数量

时间:2021-11-02 来源:互联网 编辑:宝哥软件园 浏览:

为了纪念10年不写博客,第一篇博文以这样一个有趣的小技巧开头——_ _ _-。

在ES5中,我们调用一个函数时,如果要传入的参数是根据其他函数或条件生成的,也就是说,我们不确定会传入多少个参数,在不改变原函数的情况下,该怎么办?

(当然,如果可以避免本文描述的情况,尽量避免,比如将参数改为object或array等。).

大多数人可能都知道apply可以完美地解决这个问题:

与call一样,apply将第一个参数作为函数的调用对象,也就是说,它将调用函数中的这个指针重写为第一个参数。如果它不是对象的方法,您可以不考虑这一点而传入null。

区别在于以下参数。apply将所有要传递给调用函数的参数放在一个数组中,然后像原始函数一样依次追加调用。

因为是数组,所以是可控的。根据其他函数或逻辑判断生成数组,可以达到传入动态数字参数的目的。

但是我遇到了一个头疼的问题,就是用new创建对象的时候必须要传入动态参数,几年才遇到一次这个问题:

如果用ES6,加上rest参数,以上问题都不是问题。注意,在args数组前面加三个点不是语法错误,而是ES6提供的rest参数写入,可以理解为替换.带有不带方括号的args数组字符的args。

但是在ES5真的没有办法实现吗?毕竟ES6大多是语法糖,可以用巴别塔之类的工具编译成ES5。如果您有任何问题,让我们用babel编译它,看看我们能得到什么:

看到最后一行我很震惊。不要害怕。让我们分析一下这段代码。首先把它肢解,分三步看:

1.毫无疑问,concat用于将null和我们的参数连接到一个数组中,该数组用作apply的第二个参数,以及[[null,1,2,3];]是获得的。

2.让我们计算apply,第一个参数Foo将代替Function调用本机bind方法,第二个参数数组的内容将作为bind的参数传入,从而得到foo.bind (null,1,2,3)。

3.bind方法的第一个参数类似于apply和call,并且修改了这个指针,而后面的参数可以为函数植入默认的预置前导参数,也就是说,在执行bind之后,我们得到一个Foo类,第一组括号中注入了三个参数值,叫做FooWithArgs暂时;

最终,当我们新增foowwithargs();你不需要传入任何参数。相当于新的Foo(1,2,3);

版权声明:在JS中使用apply和bind来实现作为函数或类传入的参数的动态数量是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。