簡體   English   中英

為什么在JavaScript中首先執行回調函數?

[英]Why is callback function executed first in javascript?

在下面的示例中。 lnamefname函數內部的回調函數。 執行時,第一個輸出是史密斯和比利。 據我了解,一旦fname函數完成執行,則應執行回調函數lname 為什么這里錯了?

 function fname(){ console.log("Billy");} function lname(){ console.log("Smith");} fname(lname()); 

函數的參數在調用之前先求值。 因此, fname(lname())導致調用lname ,然后調用fname lname的結果作為第一個參數傳遞給fname ,但被調用的函數不使用。

在下面的示例中。 lnamefname函數內部的回調函數。

不它不是。 您正在調用 lname (因為添加了括號),並將其調用結果(碰巧是undefined ,就像函數在沒有顯式return值的情況下一樣)傳遞給fname 就像Math.floor(Math.sqrt(10)) -這里沒有回調。 fname(lname())fname(lname)之間有很大的區別:后者將一個函數本身傳遞給另一個函數; 實際上,如果我們將其稱為“回調”,則將其稱為“回調”。

據我了解,一旦fname函數完成執行,則應執行回調函數lname

再說一次 回調在被調用時就執行了,不多也不少。 例如:

 function printsSomething() { console.log("Something"); } function invokesCallbackAtEnd(callback) { console.log("invokesCallbackAtEnd doing something"); callback(); } function invokesCallbackAtStart(callback) { callback(); console.log("invokesCallbackAtStart doing something"); } function invokesCallbackAtStartAndEnd(callback) { callback(); console.log("invokesCallbackAtStartAndEnd doing something"); callback(); } function invokesCallbackNever(callback) { console.log("invokesCallbackNever doing something"); } invokesCallbackAtEnd(printsSomething); console.log("---"); invokesCallbackAtStart(printsSomething); console.log("---"); invokesCallbackAtStartAndEnd(printsSomething); console.log("---"); invokesCallbackNever(printsSomething); console.log("---"); 

您沒有這樣定義回調函數,您必須將引用傳遞給函數,而不是函數調用本身。 fname(lname); 而且您必須將function fname更改為

function fname (cb) {
  console.log("Billy");
  cb && cb.apply(this);
}

您沒有將lname作為回調函數傳遞。 您剛剛調用了lname函數,並傳遞了其undefined返回值。

即使傳遞了回調函數,其執行點也取決於代碼。

 function fname(func) { func("Foo"); console.log("Billy"); func("Bar"); } function lname() { console.log("Smith"); return function (arg) { console.log(arg); } } fname(lname()); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM