在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?
我在阅读一本关于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(){
}
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- JavaScript 错误:未捕获类型错误:foo 不是一个函数
- JavaScript美学:;函数foo(){}"vs“;var foo=函数(){}"AMD功能
- 当用“”声明时,如何获得当前运行的函数名称;foo=函数(){..}”;
- 在节点 0.11 中使用 ES6 箭头函数,w/ foo.prototype
- $(window).resize 和 $(“#foo”).scroll 上的触发函数
- 如何在函数声明字符串中匹配“obj.foo”
- 角度定制模块-“;对象函数(){..}foo没有方法'酒吧'&”;
- 为什么我定义Foo时它不是一个函数
- 给定一个函数pipe(foo, bar, baz)(1, 2, 3),你将如何实现它等效于javascript中的baz
- 什么's;函数foo(回调)'和'foo(arg1,arg2,函数(错误,数据))'
- 在es2015中,' const func = foo =>Bar '使' func '成为一个命名函数,你如何绕过它
- javascript中的多个函数调用,如combine(foo)(bar)
- 在javascript中,如果foo是一个函数,那么foo()和foo之间的区别是什么?当它们作为参数传递给高阶函数时,
- 如果在函数中用作不能再更改的参数,foo会变成什么?
- 如何编写JS函数foo(baz),其中baz是:函数baz(para){alert(para.data);}