Javascript 如何在另一个函数中获取箭头函数的参数?
我想创建一个函数,返回另一个函数的参数。我知道我可以使用Javascript 如何在另一个函数中获取箭头函数的参数?,javascript,functional-programming,Javascript,Functional Programming,我想创建一个函数,返回另一个函数的参数。我知道我可以使用argument或rest操作符访问函数本身内部的参数,但如何在函数外部获取它们呢 const returnValue=(fn)=>{ //如何得到fn的参数?假设我知道它的算术性。 } 例如: const foo = 'bar' const hello = 'world' const returnFirstArgument = (val1, val2) => val1 const returnArgumentByPositio
argument
或rest操作符访问函数本身内部的参数,但如何在函数外部获取它们呢
const returnValue=(fn)=>{
//如何得到fn的参数?假设我知道它的算术性。
}
例如:
const foo = 'bar'
const hello = 'world'
const returnFirstArgument = (val1, val2) => val1
const returnArgumentByPosition = (fn, num) => {
//Take fn as input, return one of its parameter by number
}
const returnSecondArgument = returnArgumentByPosition(returnFirstArgument(foo, hello), 1) //Expect it returns 'world'
如果不修改
returnFirstArgument
的行为方式,您就无法完成所需的操作。以下面的代码为例:
const x = 1 + 2;
console.log(x); // 3
在将值指定给x
之前,需要将表达式1+2
计算为一个值。在这种情况下,1+2
被计算为3
,因此x
被分配到3
,这样当我们打印它时,它会在控制台中打印出文本编号3
。由于它现在只是一个数字,我们无法说出3
是如何派生出来的(它可能来自0+3
,1*3
,等等)
下面举一个类似的例子:
const max = Math.max(1, 2);
console.log(max); // 2
同样的想法也适用于上面。首先计算Math.max(1,2)
的值2
,然后将该值分配给max
。同样,我们无法说明2
是如何派生出来的
现在考虑一个函数:
const add = (x, y) => x + y;
const ans = add(1 + 2, Math.max(1, 2));
console.log(ans); // 5
调用函数时,函数的参数首先计算为值。然后将函数中的参数指定给这些值的副本:
const ans = add(1 + 2, Math.max(1, 2));
// ^--------^------------- both evaluate first before function is invoked
因此,上述函数调用变为:
const ans = add(3, 2);
因此,在add函数中,x
变为3
,y
变为2
。就像上面两个变量示例一样,我们无法知道3
来自表达式1+2
,而2
来自Math.max(1,2)
的函数调用
那么,把这个和你原来的问题联系起来。您的函数调用类似于上面显示的add函数调用:
const returnSecondArgument = returnArgumentByPosition(returnFirstArgument(foo, hello), 1)
与其他示例一样,传递给函数的参数不能是表达式,因此需要首先对其求值returnFirstArgument(foo,hello)
在调用returnArgumentByPosition
函数之前计算为一个值。它将计算为字符串“bar”
。这会导致fn
在returnArgumentByPosition
中变成的“条”
。由于“bar”
只是一个字符串,我们必须再次告诉您它来自何处,因此无法访问创建它的函数。因此,我们无法访问函数的第二个参数,因为该信息不会保留在任何地方
一种方法是创建一个
recall
函数。回调函数能够“保存”传递给它的参数,然后在以后公开它们。简单地说,它包装了原始函数,但能够保存参数和调用原始函数的结果:
const add = (x, y) => x + y;
const ans = add(1 + 2, Math.max(1, 2));
console.log(ans); // 5
const recall=fn=>(…args)=>{
返回{
args,
结果:fn(…args),
}
};
常量添加=召回((x,y)=>x+y);
常量getN=({args},n)=>{
返回参数[n];
}
常数res=getN(加(1,2,1);
控制台日志(res)
你能给我们举个例子说明调用returnValue()
时会是什么样子(即:你会给它什么样的输入?)以及你期望得到什么样的结果吗?我已经用一个例子进行了更新。不确定这样的东西是否可以实现,但我想它可能非常有用。如果不修改returnFirstArgument
的行为,就不可能实现。JS将首先计算returnFirstArgument(foo,hello)
,然后使用计算的参数调用returnArgumentByPosition
。因此fn
内部returnArgumentByPosition
将只是一个字符串,不知道“where”来自何处感谢您的详细解释并指出我遗漏了什么。如果函数是curry函数,部分完成但未调用,有没有可能用另一个函数获取它的参数?@JohnWinston我已经在我的答案中添加了更多细节,以获得一些可能的解决方案。我不认为在这里使用输入函数会有多大帮助,因为你不能从函数本身之外访问封闭的输入参数。谢谢你,尼克!你的解释非常清楚,最后一个例子确实提醒了我FP与数学的关系。我将努力理解所有这些,并制定自己的解决方案,我希望我能很快向您展示。@JohnWinston我认为提高FP的一个好方法是使用haskell之类的函数式编程语言。这不是一门容易学的语言,但它迫使你使用诸如咖喱等FP概念。我不是FP专家,我只知道github页面上列出的大约3/4的组合词。但我认为,尝试使用一种强烈关注FP的语言,肯定会迫使你的思维开始以涉及函数式解决方案的方式思考,随着时间的推移,这将有助于提高你的FP能力。