-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
js-函数柯里化 #12
Comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
柯里化
柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术
用途
实现原理
「用闭包把传入的参数保存起来,当传入的参数的数量足够执行函数时,就开始执行函数」
第一版
已经有柯里化的感觉了,但是还没有达到要求,不过我们可以把这个函数用作辅助函数,帮助我们写真正的 curry 函数。
第二版
参考文档:[[JavaScript专题之函数柯里化](https://github.com/mqyqingfeng/Blog/issues/42)](mqyqingfeng/Blog#42)
第三版
参考文档:yygmind/blog#37
解析
前面两次调用每次返回一个新函数,第三次调用后满足参数长度要求然后执行函数
再来看 currying 实现函数,其实就是判断当前参数长度够不够,参数够了就立马执行,不够就返回一个新函数,这个新函数并不执行,并且通过
bind
或者闭包保存之前传入的参数扩展:函数参数 length
函数
currying
的实现中,使用了fn.length
来表示函数参数的个数,那么fn.length
表示函数的所有参数个数吗? 并不是函数的
length
属性获取的是形参的个数,但是形参的数量不包括剩余参数的个数,而且仅包括第一个具有默认值之前的参数的个数所以在柯里化的场景中,不推荐使用
ES6
的函数参数默认值我们期望函数 fn 输出
[1, 2, 3]
,但是实际上调用柯里化函数时((a = 1, b, c) => {}).length === 0
,所以调用fn()
时就已经执行并输出了[1, undefined, undefined]
,而不是理想中的返回闭包函数,所以后续调用fn()(2)(3)
将会报错。总结
Function.prototype.call.bind(Object.prototype.toString)
currying
函数,就是用闭包把传入的参数保存起来,等到传入的参数足够执行函数时,就开始执行函数length
: 获取的是形参的个数,但是形参的数量不包括剩余参数的个数,而且仅包括第一个具有默认值之前的参数个数The text was updated successfully, but these errors were encountered: