调用函数时对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))
在 found
和 found1
中,您正在定义一个 匿名函数 并且 find()
将其作为参数,而 found2
checkit
函数已经定义,它直接将其作为参数。
对于匿名函数,我们必须定义匿名函数采用的参数,因此 found
和 found1
采用参数而不是 found2
,因为您在声明它时已经这样做了。
found2 = array1.find(checkit(x));
这里你实际上是用一个未定义的参数 x
调用 checkit
而不是将函数作为参数传递。
Array.prototype.find
接受一个函数作为参数。当您按名称传递函数时,它只是 shorthand for array1.find(x => callback(x))
.
下面接受的答案解释了为什么 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))
在 found
和 found1
中,您正在定义一个 匿名函数 并且 find()
将其作为参数,而 found2
checkit
函数已经定义,它直接将其作为参数。
对于匿名函数,我们必须定义匿名函数采用的参数,因此 found
和 found1
采用参数而不是 found2
,因为您在声明它时已经这样做了。
found2 = array1.find(checkit(x));
这里你实际上是用一个未定义的参数 x
调用 checkit
而不是将函数作为参数传递。
Array.prototype.find
接受一个函数作为参数。当您按名称传递函数时,它只是 shorthand for array1.find(x => callback(x))
.