在 Javascript 中,如何将一个值传递给作为另一个函数参数的函数?

问题描述 投票:0回答:1

我有一个适用于对象数组的函数。但有时它使用对象中的一个值,有时使用另一个值,有时它使用对象中的值在不同的对象中查找某些内容。所以没问题,使用 Javascript,我可以传递一个函数作为参数,并编写一个重试相关值的函数。

所以忘记数组业务,让我在这里给出该函数的简化版本,消除与我的问题无关的所有复杂性。假设我们只想比较两个对象的“某些”值。所以我写了这个:

function compareThem(a,b,f) {
  return f(a)==f(b)
}

因此,如果对象包含一个名为“value1”的成员,我可以写:

let flag=compareThem(a,b,(o1) => o1.value1)

或者如果我想比较 value2,我可以写:

let flag=compareThem(a,b,(o1) => o1.value2)

酷。但这是问题所在。有时我需要对象中没有的数据。就像在一种情况下,对象包含一个数组,我想检查该数组中的特定元素。如果我知道它总是,比如说,#7,我就可以写

let flag=compareThem(a,b,(o1) => o1.myarray[7])

但问题是,索引位于变量中。我真正想说的是

let flag=compareThem(a,b,(o1) => o1.myarray[x])

但是我如何获得其中 x 的值呢?在我的第一份草案中,我为 x 添加了一个参数,但这是一个问题,因为每次调用该函数时,我都会使用不同的数据,并且我不想拥有一大堆参数,每个参数仅适用于一次调用。

我最终发现调用的范围是在调用者的范围内,所以我可以说

let x=1
let flag=compareThem(a,b,(o1) => o1.myarray[x])

这样就可以了。但这看起来真的很难看——像这样神奇地将数据传递给函数。我真的想以某种方式将它放在函数定义中。但是我如何告诉 JS 这是从调用者传入的值,而不是函数内的局部变量呢?有什么办法可以说吗?

javascript function
1个回答
0
投票

您可以使用 bind():

 传递
部分应用的函数

function compareThem(a, b, f) {
  return f(a) == f(b);
}

const a = { myarray: [10, 20] };
const b = { myarray: [100, 20] };

let flag = compareThem(a, b, ((index, o) => o.myarray[index]).bind(null, 1));

console.log(flag)

© www.soinside.com 2019 - 2024. All rights reserved.