在javascript中,如果foo是一个函数,那么foo()和foo之间的区别是什么?当它们作为参数传递给高阶函数时,

In javascript if foo is a function, what is the difference between foo() and foo, and how do they differ when passed as args to high-order functions?

本文关键字:foo 函数 是什么 高阶 参数传递 区别 如果 javascript 之间 那么 一个      更新时间:2023-09-26

我在阅读一本关于node.js的书时刚刚开始学习javascript。在第一个示例中,它显示了一个高阶函数:

setTimeout(function () {
    console.log('2000 milliseconds have passed since this demo started');
}, 2000);

当我在REPL中运行它时,它可以工作。它等待2秒,然后写入我给它的字符串。

所以我试着做一些我希望能产生相同输出的事情:

setTimeout(console.log('2000 milliseconds have passed since this demo started'),2000);

立即打印出字符串。我猜setTimeout仍然等待,然后在2秒结束时什么也没做。由于某些原因,它只是先打印出字符串。

我稍微摆弄了一下,创建了另一个只输出字符串的函数:

function tester() {
    console.log('tester function ran');
}

然后在setTimeout中调用这个函数:

setTimeout(tester(),2000);

它仍然先打印出test()中的字符串,然后等待2秒,不做任何其他操作。

我试着去掉括号:

setTimeout(tester,2000);

这个"工作"。它等待2秒,然后在tester()中打印出字符串。

我现在的问题是在这种情况下tester()和tester之间的区别是什么?这是否意味着我不能将参数传递给高阶函数setTimeout()内部的函数?如果是,为什么?

我现在的问题是在这种情况下tester()和tester之间的区别是什么?

foo作为函数求值。

foo()调用函数(不带参数)并计算为其返回值。

这是否意味着我不能将参数传递给高阶函数setTimeout()内部的函数?

setTimeout,在您至少在浏览器中找到的实现中,允许您在调用setTimeout的第三,第四等参数中指定要传递给函数的参数。你也可以创建一个新函数,它除了用指定的参数调用现有的函数之外什么都不做。bind方法使这很容易。

foo是对函数本身的引用,foo()调用函数,是函数返回的值。

setTimeout(tester(),2000);的情况下,您实际上是在调用方法测试人员。因为它没有任何回调,所以它不会做任何事情。

setTimeout期望一个回调方法作为第一个参数,这就是当你调用setTimeout(tester,2000);时传递的。

本质上,当您指定名称时,您引用的是方法定义。但是tester()是方法调用。

参见下面定义方法的样式。这样就更清楚了,tester实际上是方法定义:

var tester = function(){
}