簡體   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