Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在另一个函数中获取箭头函数的参数?_Javascript_Functional Programming - Fatal编程技术网

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能力。