繁体   English   中英

JavaScript中的一流函数

[英]First class functions in Javascript

我正在阅读有关SitePoint的文章( https://www.sitepoint.com/javascript-closures-demystified/ ),并且有一个一流函数的示例:

var foo = function() {
 console.log("Hello World!");
};
var bar = function(arg) {
return arg;
};
bar(foo)();

最后一行的语法让我感到困惑,我会这样写:

bar(foo());

有谁知道语法是否可行,或者是否有充分的理由按照文章编写的方式编写它? 如果是这样,请说明原因。

谢谢,

威廉

有人知道这两种语法是否正确吗?

完全不同。

bar(foo)()调用bar,将foo作为参数传递,获取bar的返回值,然后将该返回值作为函数调用。

bar(foo())调用foo,获取foo的返回值,然后调用bar,将foo的返回值作为参数传递给它。

有充分的理由按照文章撰写方式进行撰写

这是一个完全人为的例子。 没有实际的理由让酒吧参与其中。 它只是表明您可以像传递其他任何值一样传递函数(您的版本不这样做)。

术语“一流的功能”通常可以被认为是通过传递变量的方式传递函数的能力。

最后一个例子是使用foo (一个函数),并将其传递给另一个函数bar() bar()返回另一个函数,该函数将在紧随其后被调用,因此多余的()在末尾被调用。 因此,编写示例的方式不仅是一种风格方法。 它显示了如何将功能传递给其他功能。

bar(foo)();

使用foo(一个函数,而不是函数的返回值)作为参数调用函数栏。 由于bar返回参数,因此bar最终返回函数。 最后添加()可使返回的函数执行。

bar(foo());

使用foo()的返回值作为参数来调用功能栏

该代码示例显示了将一个函数作为参数传递给另一个函数并从该函数返回的原因,是为了说明函数是对象,并且可以像一个对象一样传递。

两者本质上是不同的,并且将实现不同的目标。 让我们看看两者。

bar(foo)();

这个传递给功能的基准 bar作为唯一的参数传递给功能bar ,它迅速地返回传递函数作为返回值,然后将其通过最终执行()

本质上,这是执行foo的费力方法。

bar(foo());

这首先执行foo并传递返回值(不算什么)作为bar的唯一参数。 没有其他事情了。

结果将是相同的,但是两种语法的作用是不同的。 编写bar(foo)(); bar 返回一个函数 ,然后调用此函数。 它的意思是:

  • bar方法主体中的arg持有对foo的引用;
  • barfoo之前执行;
  • bar返回一个函数。

编写bar(foo()) ,您首先调用foo ,然后将其结果传递给bar。 它的意思是:

  • bar方法主体中的arg包含对字符串"Hello World"的引用
  • foo首先被调用
  • bar返回一个字符串

编写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(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM