JS中使用apply、bind实现为函数或者类传入动态个数的参数

 更新时间:2016年04月26日 11:14:49   作者:BrandonChen  
这篇文章主要介绍了JS中使用apply、bind实现为函数或者类传入动态个数的参数的相关资料,需要的朋友可以参考下

为纪念10年没写blog,第一篇博文就以这样一个有趣的窍门开始吧 -___-

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

(当然了,能避免此文所述情况发生就尽量避免,比如将参数改为object或array等等)


大部分人可能知道用apply能完美解决这个问题:


apply与call一样会将第一个参数作为函数的调用对象,即改写了调用函数内的this指针为第一个参数,如果不是对象的方法,可以不考虑this,传入一个null即可。

而不同之处在于后面的参数,apply将所有要传入调用函数的参数放在一个数组中,call是与原函数一样依次追加进去。


既然是数组那就可控了,根据其他函数或逻辑判断来生成数组,可达到传入动态个数参数的目的。

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


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


但ES5里真的就没有办法实现了吗?毕竟ES6大部分都是语法糖,可以用babel一类的工具编译为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类似,修改this指针,而后面的参数可以为函数植入默认的前置参数值(preset leading argument),也就是说当bind执行完后在第一组小括号内我们得到一个已经注入了三个参数值的Foo类,暂且叫FooWithArgs;

最终,当我们 new FooWithArgs(); 时,就不用传入任何参数了。等同于 new Foo(1, 2, 3);

相关文章

  • 微信jssdk踩坑之签名错误invalid signature

    微信jssdk踩坑之签名错误invalid signature

    这篇文章主要介绍了微信jssdk踩坑之签名错误invalid signature,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • layer.js之回调销毁对话框的例子

    layer.js之回调销毁对话框的例子

    今天小编就为大家分享一篇layer.js之回调销毁对话框的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 8个JavaScript条件语句优化小技巧分享

    8个JavaScript条件语句优化小技巧分享

    在日常的开发中,我们经常会编写一些条件语句,过多的 if...else会导致代码难以理解和维护,今天小编来分享几个优化条件语句的小技巧,希望对大家有所帮助
    2022-07-07
  • 前端微信H5公众号实现授权登录的方法总结

    前端微信H5公众号实现授权登录的方法总结

    这篇文章主要介绍了如何在微信公众号中实现网页授权功能,包括创建微信服务公众号、配置重定向地址、调试和开发使用等步骤,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • JS实现获取进今年第几天是周几的方法分析

    JS实现获取进今年第几天是周几的方法分析

    这篇文章主要介绍了JS实现获取进今年第几天是周几的方法,结合实例形式对比分析了JavaScript进行日期与天数运算相关操作技巧与注意事项,需要的朋友可以参考下
    2018-06-06
  • 图片自动更新(说明)

    图片自动更新(说明)

    图片自动更新(说明)...
    2006-10-10
  • 如何提高数据访问速度

    如何提高数据访问速度

    本文主要介绍了提高数据访问速度的方法,具有很好的参考作用,需要的朋友一起来看下吧
    2016-12-12
  • EditPlus中的正则表达式 实战(4)

    EditPlus中的正则表达式 实战(4)

    这篇文章主要介绍了 EditPlus中的正则表达式 实战(4)的相关资料,需要的朋友可以参考下
    2016-12-12
  • ES6基础之字符串和函数的拓展详解

    ES6基础之字符串和函数的拓展详解

    这篇文章主要介绍了ES6基础之字符串和函数的拓展,结合实例形式分析了ES6字符串与函数扩展的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-08-08
  • 微信小程序间使用navigator跳转传值问题实例分析

    微信小程序间使用navigator跳转传值问题实例分析

    这篇文章主要介绍了微信小程序间使用navigator跳转传值问题,结合实例形式分析了微信小程序间使用navigator跳转传值过程中遇到的问题与解决方法,需要的朋友可以参考下
    2020-03-03

最新评论