溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript回調函數有什么用

發布時間:2021-06-30 10:08:44 來源:億速云 閱讀:142 作者:小新 欄目:web開發

這篇文章主要為大家展示了“javascript回調函數有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“javascript回調函數有什么用”這篇文章吧。

在javascript中,回調函數就是一個被作為參數傳遞的函數。函數A作為參數(函數引用)傳遞到另一個函數B中,并且這個函數B執行函數A,函數A就叫做回調函數;如果沒有名稱(函數表達式),就叫做匿名回調函數。

本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

什么是回調函數(Callback)

在JavaScript中,函數是對象。 因此,函數可以將函數作為參數,并且可以由其他函數返回。 執行此操作的函數稱為高階函數。 作為參數傳遞的任何函數都稱為回調函數。

回調函數具體的定義為:函數A作為參數(函數引用)傳遞到另一個函數B中,并且這個函數B執行函數A。我們就說函數A叫做回調函數。如果沒有名稱(函數表達式),就叫做匿名回調函數。

為什么我們需要回調?

出于一個非常重要的原因-JavaScript是一種事件驅動語言。這意味著JavaScript不會繼續等待響應,而是會在偵聽其他事件時繼續執行。讓我們看一個基本的例子:

function first(){
  console.log(1);
}
function second(){
  console.log(2);
}
first();
second();

如你所料,首先執行函數,然后執行第二函數,將以下內容記錄到控制臺:

// 1
// 2

到目前為止一切都很好。

但是,如果函數包含無法立即執行的某些代碼怎么辦? 例如,我們必須先發送請求然后等待響應的API請求? 為了模擬此動作,將使用setTimeout,它是一個JavaScript函數,將在設置的時間后調用該函數。 我們將功能延遲500毫秒以模擬API請求。 我們的新代碼將如下所示:

function first(){
  // Simulate a code delay
  setTimeout( function(){
    console.log(1);
  }, 500 );
}
function second(){
  console.log(2);
}
first();
second();

現在了解setTimeout()的工作方式并不重要。重要的是,你看到我們把console.log(1)移到500毫秒延遲內。那么,當我們調用函數時會發生什么呢?

first();
second();
// 2
// 1

即使我們先調用了first()函數,我們在second()函數之后才打印了它的結果。

這并不是說JavaScript沒有按照我們想要的順序執行我們的函數,而是JavaScript在繼續執行second()之前沒有等待first()的響應。

那為什么給你看這個呢?因為你不能在一個函數后調用另一個另一個函數,而又希望它們以正確的順序執行?;卣{是一種確保某些代碼在其他代碼已經完成執行之前不會執行的方法。

創建一個回調函數

好了,話不多說,讓我們創建一個回調!

首先,打開您的Chrome開發者控制臺(Windows:Ctrl + Shift + J)(Mac:Cmd + Option + J),然后在控制臺中鍵入以下函數聲明:

function doHomework(subject) {
  alert(`Starting my ${subject} homework.`);
}

現在讓我們添加回調-作為doHomework()函數中的最后一個參數,我們可以傳入回調。然后在對doHomework()的調用的第二個參數中定義回調函數。

function doHomework(subject, callback) {
  alert(`Starting my ${subject} homework.`);
  callback();
}

doHomework('math', function() {
  alert('Finished my homework');
});

可以看到,如果你在控制臺中輸入上述代碼,則會收到兩個alert:“starting homework”alert,然后是“finished homework”alert。

但是,并非總是必須在我們的函數調用中定義回調函數。它們可以在我們的代碼的其他地方定義,如下所示:

function doHomework(subject, callback) {
  alert(`Starting my ${subject} homework.`);
  callback();
}
function alertFinished(){
  alert('Finished my homework');
}
doHomework('math', alertFinished);

此示例的結果與前面的示例完全相同,但是設置略有不同。我們可以看到,在doHomework()函數調用期間,我們已將alertFinished函數定義作為參數傳遞。

一個真實的例子

我們嘗試調用Twitter的API。 向API發出請求時,必須等待響應,然后才能對該響應采取行動。 這是真實回調的一個很好的例子。 請求長這樣:

T.get('search/tweets', params, function(err, data, response) {
  if(!err){
    // This is where the magic will happen
  } else {
    console.log(err);
  }
})

T.get意味著我們正在向Twitter發送獲取請求

此請求中包含三個參數:“ search / tweets”(這是我們的請求的路由),params(這是我們的搜索參數)和一個匿名函數(即我們的回調)。

回調在這里很重要,因為我們需要等待服務器的響應才能繼續執行代碼。 我們不知道我們的API請求是否會成功,因此在通過get請求將參數發送到search/tweets后,我們等待。 一旦Twitter響應后,將調用我們的回調函數。 Twitter會向我們發送錯誤(錯誤)對象或響應對象。 在回調函數中,我們可以使用if()語句來確定我們的請求是否成功,然后對新數據采取相應措施。

以上是“javascript回調函數有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女