我正在阅读有关SitePoint(https://www.sitepoint.com/javascript-closures-demystified/)的文章,并且有一个第一类函数的示例:
getx()
最后一行的语法让我感到困惑,我会把它写成:
var foo = function() {
console.log("Hello World!");
};
var bar = function(arg) {
return arg;
};
bar(foo)();
有没有人知道这两种语法是否正常,或者是否有充分的理由以文章的方式编写它?如果是这样,请解释原因是什么。
谢谢,
威廉
答案 0 :(得分:2)
有没有人知道两种语法是否正常,
完全不同。
bar(foo)()
调用bar,将其作为参数传递给foo,获取bar的返回值,然后将该返回值作为函数调用。
bar(foo())
调用foo,获取foo的返回值,然后调用bar,将foo的返回值作为参数传递给它。
有一个很好的理由以文章写的方式写它
这是一个完全做作的例子。根本没有任何实际理由让酒吧参与其中。它只是表明您可以像任何其他值一样传递函数(您的版本不会这样做)。
答案 1 :(得分:0)
术语"头等功能"通常可以认为是以与变量相同的方式传递函数的能力。
最后一个示例是将foo
作为一个函数,并将其传递给另一个函数bar()
。 bar()
返回另一个函数,并在之后立即调用,因此结尾处有额外的()
。因此,编写示例的方式不仅仅是一种风格方法;它展示了如何将函数传递到其他函数中。
答案 2 :(得分:0)
bar(foo)();
使用foo(函数,而不是函数的返回值)作为参数调用函数栏。由于bar返回参数,因此bar最终返回一个函数。最后添加()会导致返回的函数被执行。
bar(foo());
使用foo()的返回值作为参数
调用函数栏代码示例显示函数作为参数传递给另一个函数并从函数返回的原因是为了展示函数是对象并且可以像一个函数一样传递。
答案 3 :(得分:0)
这两者根本不同,会实现不同的目标。让我们看看两者。
bar(foo)();
这会将引用传递给函数bar
,作为函数bar
的唯一参数,它会立即返回传递的函数作为返回值,然后执行通过最后的()
。
基本上,执行foo
是一种费力的方式。
bar(foo());
首先执行foo
并传递返回值 - 这是什么都没有 - 作为bar
的唯一参数。什么都没发生。
答案 4 :(得分:0)
结果将是相同的,但两种语法的作用是不同的。撰写bar(foo)();
时,bar
会返回一个函数,然后调用此函数。这意味着:
arg
方法正文中的bar
会引用foo
; bar
在foo
; bar
返回一个函数。写bar(foo())
,首先调用foo
,然后将结果传递给bar。这意味着:
arg
方法正文中的bar
包含对字符串"Hello World"
的引用foo
bar
返回一个字符串答案 5 :(得分:0)
当您编写foo
时,您正在引用函数foo
,而不是此函数返回的值。该功能未执行。
当您编写foo()
时,您正在执行该功能并返回其值。
因此,当您说bar(foo)()
时,您将函数 foo
作为参数传递给bar
。由于bar
返回它收到的任何参数,这次它返回函数foo
,然后它正在被执行。
为了简化,这就是发生的事情:
var foo = function() {
console.log("Hello World!");
};
var bar = function(arg) {
return arg;
};
var returnFromBar = bar(foo);
returnFromBar();