Javascript js-高阶一元函数-为什么需要这个?
从这里开始:下面的代码片段没有按预期工作:Javascript js-高阶一元函数-为什么需要这个?,javascript,higher-order-functions,currying,Javascript,Higher Order Functions,Currying,从这里开始:下面的代码片段没有按预期工作: ['1', '2', '3'].map(parseInt) // [1, NaN, NaN] <- bad output 我的问题是: 这个一元函数是如何工作的 在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用 任何帮助都将不胜感激:) 未来读者注意:结帐 这个一元函数是如何工作的 函数的长度是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,unary通过查看函数是否声明只接受一个参
['1', '2', '3'].map(parseInt) // [1, NaN, NaN] <- bad output
我的问题是:
一元函数是如何工作的
未来读者注意:结帐 这个一元函数是如何工作的 函数的
长度
是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,unary
通过查看函数是否声明只接受一个参数,如果接受,则返回原始函数,如果不接受,则创建一个只使用一个参数调用原始函数的新函数
此检查不可靠,我不会使用该版本的一元代码。许多函数根据它们得到的实际参数的数量来改变它们的行为,即使它们只声明了一个参数
在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用
一个总是做包装的版本(不看长度
)对于类似于parseInt
一个的情况可能很方便:您只想用X个参数(在您的例子中是1个)调用另一个函数,而不管回调函数提供了多少参数
这种事情在中国很常见。如果您一般不做函数式编程,那么在使用箭头函数的今天,它可能没有多大用处。但是相当多的人以功能性的方式使用JavaScript
*是的,有那么复杂。示例(需要支持ES2015[aka“ES6”]默认参数值和rest参数的浏览器):
函数a(一){}
函数b(一,二){}
函数c(一,二,…剩余){}
函数d(1,2=42,…rest){
函数e(一,二=42,三){}
console.log(a.length);//1.
console.log(b.length);//2.
console.log(c.length);//2.
console.log(d.length);//1.
console.log(e.length);//1
这个一元函数是如何工作的
函数的长度
是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,unary
通过查看函数是否声明只接受一个参数,如果接受,则返回原始函数,如果不接受,则创建一个只使用一个参数调用原始函数的新函数
此检查不可靠,我不会使用该版本的一元代码。许多函数根据它们得到的实际参数的数量来改变它们的行为,即使它们只声明了一个参数
在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用
一个总是做包装的版本(不看长度
)对于类似于parseInt
一个的情况可能很方便:您只想用X个参数(在您的例子中是1个)调用另一个函数,而不管回调函数提供了多少参数
这种事情在中国很常见。如果您一般不做函数式编程,那么在使用箭头函数的今天,它可能没有多大用处。但是相当多的人以功能性的方式使用JavaScript
*是的,有那么复杂。示例(需要支持ES2015[aka“ES6”]默认参数值和rest参数的浏览器):
函数a(一){}
函数b(一,二){}
函数c(一,二,…剩余){}
函数d(1,2=42,…rest){
函数e(一,二=42,三){}
console.log(a.length);//1.
console.log(b.length);//2.
console.log(c.length);//2.
console.log(d.length);//1.
console.log(e.length);//1
这个一元函数是如何工作的
函数的length
属性返回函数具有的形式参数数*。一元函数检查函数是否有一个形式参数。如果是这样,它只返回原始函数。如果不是,则返回一个新函数,该函数接受单个参数,将其传递给f
,并返回结果
在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用
如示例所示,某些函数会根据传入的参数数量改变其行为。通常(例如当您使用.map
)时,您实际上只想传入一个参数,unary()
有助于实现这一点
*或者至少过去是这样。随着ES6的发布,它现在变得更加复杂了。详见T.J.Crowder的答案
这个一元函数是如何工作的
函数的length
属性返回函数具有的形式参数数*。一元函数检查函数是否有一个形式参数。如果是这样,它只返回原始函数。如果不是,则返回一个新函数,该函数接受单个参数,将其传递给f
,并返回结果
在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用
如示例所示,某些函数会根据传入的参数数量改变其行为。通常(例如当您使用.map
)时,您实际上只想传入一个参数,unary()
有助于实现这一点
*或者至少过去是这样。随着ES6的发布,它现在变得更加复杂了。有关详细信息,请参见T.J.Crowder的答案。在这个一元函数中,fn.length检查parseInt的参数长度,
如果parseInt只有一个参数,那么它会像往常一样返回函数。但在这种情况下,
我们有两个
['1', '2', '3'].map(a => parseInt(a)) // [ 1, 2, 3 ] <- good output
const unary = (f) => {
return f.length === 1 ? f : (args) => f(args)
}
['1', '2', '3'].map(unary(parseInt)) // [ 1, 2, 3 ] <- good output again!