调用函数时对js符号感到困惑

confused over js notation when calling functions

下面接受的答案解释了为什么 checkit(x) 不起作用。

我对以下符号有点困惑:

const array1 = [5, 12, 8, 130, 44];

function checkit(x){
return x == 8;}

const found = array1.find(element => element > 10);
const found1 = array1.find(function(x){return (x < 10);});
const found2 = array1.find(checkit);

console.log(found,found1,found2);

found 和 found1 对我来说非常有意义。为什么在 found2 中我们不必命名被测试的变量?即为什么不:

  found2 = array1.find(checkit(x));

有人可以提供参考吗?

Array.find() 接受一个函数。你给了它一个函数:checkit。给它 checkit(x) 实际上意味着给它调用 checkit(x) 是什么,所以你实际上会说 Array.find(false) (或者一个错误,因为 x 在范围)。

const array1 = [5, 12, 8, 130, 44];

function checkit(x) {
  return x == 8;
}

// A reference to a function
const foundArg = element => element > 10;

// Another reference to a function
const found1Arg = function(x) {
  return (x < 10);
}

// More function references
const found2Arg = checkit

// BAD! found3Arg is now a boolean!
//const found3Arg = checkit(x);

const found = array1.find(foundArg);
const found1 = array1.find(found1Arg);
const found2 = array1.find(found2Arg); 
//const found3 = array1.find(found3Arg); // Error!

console.log(found, found1, found2);

因为变量checkit引用了一个函数。您还不想调用此函数,您希望回调来调用它。

array1.find(checkit(x)) 将使用参数 x 执行函数 checkit 并将其 return 值作为回调,我们不希望这样。我们只希望 find 函数获取存储在 checkit 变量中的函数引用。

参见下面的示例。

function functionThatTakesACallback(callback) {
  return callback();
}

let callback1 = () => {
  console.log('this is the callback1');
}

let callback2 = () => {
  console.log('this is the callback2');
}

let shouldWeTakeCallback2 = (bool) => {
  return bool ? callback2 : callback1
}

// will log 'this is the callback1'
functionThatTakesACallback(callback1)

// will execute shouldWeTakeCallback2 and takes it's returns value as the callback
// so it will log 'this is the callback2'
// if we change the boolean value to false, it would log 'this is the callback1' 
functionThatTakesACallback(shouldWeTakeCallback2(true))

foundfound1 中,您正在定义一个 匿名函数 并且 find() 将其作为参数,而 found2 checkit 函数已经定义,它直接将其作为参数。

对于匿名函数,我们必须定义匿名函数采用的参数,因此 foundfound1 采用参数而不是 found2,因为您在声明它时已经这样做了。

 found2 = array1.find(checkit(x));

这里你实际上是用一个未定义的参数 x 调用 checkit 而不是将函数作为参数传递。

Array.prototype.find 接受一个函数作为参数。当您按名称传递函数时,它只是 shorthand for array1.find(x => callback(x)).