<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
把函數當作一個引數傳到另外一個函數中,當需要用這個函數是,再回撥執行()這個函數.
回撥函數是一段可執行的程式碼段,它作為一個引數傳遞給其他的程式碼,其作用是在需要的時候方便呼叫這段(回撥函數)程式碼。(作為引數傳遞到另外一個函數中,這個作為引數的函數就是回撥函數)
理解:函數可以作為一個引數傳遞到另外一個函數中。
<script> function add(num1, num2, callback) { var sum = num1 + num2; callback(sum); } function print(num) { console.log(num); } add(1, 2, print); //3 </script>
分析:add(1, 2, print);中,函數print作為一個引數傳入到add函數中,但並不是馬上起作用,而是var sum = num1 + num2;執行完之後需要列印輸出sum的時候才會呼叫這個函數。(這個作為引數傳遞到另外一個函數中,這個作為引數的函數就是回撥函數.
匿名回撥函數:
<script> function add(num1, num2, callback) { var sum = num1 + num2; callback(sum); } add(1, 2, function (sum) { console.log(sum); //=>3 }); </script>
1.不會立即執行
回撥函數作為引數傳遞給一個函數的時候,傳遞的只是函數的定義並不會立即執行。和普通的函數一樣,回撥函數在呼叫函數數中也要通過()
運運算元呼叫才會執行。
2.回撥函數是一個閉包
回撥函數是一個閉包,也就是說它能存取到其外層定義的變數。
3.執行前型別判斷
在執行回撥函數前最好確認其是一個函數。
<script> function add(num1, num2, callback) { var sum = num1 + num2; //判定callback接收到的資料是一個函數 if (typeof callback === 'function') { //callback是一個函數,才能當回撥函數使用 callback(sum); } } </script>
注意在回撥函數呼叫時this的執行上下文並不是回撥函數定義時的那個上下文,而是呼叫它的函數所在的上下文。
舉例:
<script> function createData(callback){ callback(); } var obj ={ data:100, tool:function(){ createData(function(n){ console.log(this,1111); //window 1111 }) } } obj.tool(); </script>
分析:this指向是 離它最近的或者巢狀級別的 function/方法的呼叫者,這裡離它最近的function是
function(n),會回到上面的callback()中,這時候呼叫者就不是obj而是window。
解決回撥函數this指向的方法1:箭頭函數
回撥函數(若回撥函數是普通函數時)當引數傳入另外的函數時,若不知道這個函數內部怎麼呼叫回撥函數,就會出現回撥函數中的this指向不明確的問題(就比如上面例子中this指向的不是obj而是window)。所以 把箭頭函數當回撥函數,然後作為引數傳入另外的函數中就不會出現this指向不明的問題。
<script> function createData(callback){ callback(); } var obj ={ data:100, tool:function(){ createData((n)=>{ this.data = n; }) } } obj.tool(); console.log(obj.data); </script>
分析:回撥函數用箭頭函數寫之後,this指向很明確,就是 離它最近的或者巢狀級別的 function/方法的呼叫者,所以這裡是 obj 。
解決回撥函數this指向的方法2:var self = this;
<script> function createData(callback){ callback(999); } var obj ={ data:100, tool:function(){ var self = this; //這裡的this指向obj,然後當一個變數取用 createData(function(n){ self.data = n; }) } } obj.tool(); console.log(obj.data); </script>
有一個非常重要的原因 —— JavaScript 是事件驅動的語言。這意味著,JavaScript 不會因為要等待一個響應而停止當前執行,而是在監聽其他事件時繼續執行。來看一個基本的例子:
<script> function first() { console.log(1); } function second() { console.log(2); } first(); second(); </script>
分析:正如你所料,first
函數首先被執行,隨後 second
被執行 —— 控制檯輸出:1 2
但如果函數 first
包含某種不能立即執行的程式碼會如何呢?例如我們必須傳送請求然後等待響應的 API 請求?為了模擬這種狀況,我們將使用 setTimeout
,它是一個在一段時間之後呼叫函數的 JavaScript 函數。我們將函數延遲 500 毫秒來模擬一個 API 請求,新程式碼長這樣:
<script> function first() { // 模擬程式碼延遲 setTimeout(function () { //所以function(){console.log(1)}是回撥函數 console.log(1); }, 500); } function second() { console.log(2); } first(); second(); </script>
分析:這裡 function(){console.log(1)}函數當作一個引數傳入setTimeout函數中,因為setTimeout是官方提供得一個函數,裡面有很多複雜的業務程式,所以函數 function(){console.log(1)}傳入後,不一定馬上執行,要setTimeout裡面要執行到function(){console.log(1)}時才會執行該函數引數,那是不是整個程式就一直等setTimeout執行?不是的!!!
整個程式執行結果為: 2 1 ,並不是原先的1 2 .即使我們首先呼叫了 first()
函數,我們記錄的輸出結果卻在 second()
函數之後。
這不是 JavaScript 沒有按照我們想要的順序執行函數的問題,而是 JavaScript 在繼續向下執行 second()
之前沒有等待 first()
響應的問題。回撥正是確保一段程式碼執行完畢之後再執行另一段程式碼的方式。
定義:回撥函數被認為是一種高階函數,一種被作為引數傳遞給另一個函數的高階函數。回撥函數的本質是一種模式(一種解決常見問題的模式),因此回撥函數也被稱為回撥模式。
簡而言之:一個函數在另一個函數中被呼叫。而且可以當引數傳給其他函數。
所以: 回撥函數和非同步操作的關係是沒有關係!!!
那為什麼很多的非同步操作都有回填函數啊??
問:你所知道的非同步操作,是回撥的作用麼??? 並不是。
回撥:更多的可以理解為一種業務邏輯把 非同步程式設計:JS程式碼的執行順序
簡單理解:callback 顧名思義 打電話回來的意思
eg1:你點外賣,剛好你要吃的食物沒有了,於是你在店老闆那裡留下了你的電話,過了幾天店裡有了,店員就打了你的電話,然後你接到電話後就跑到店裡買了。在這個例子裡,你的電話號碼就叫回撥函數,你把電話留給店員就叫登記回撥函數,店裡後來有貨了叫做觸發了回撥關聯的事件,店員給你打電話叫做呼叫回撥函數,你到店裡去取貨叫做響應回撥事件。
eg2:再比如,你傳送一個axios 請求,請求成功之後,觸發成功的回撥函數,請求失敗觸發失敗的回撥函數。這裡面的回撥函數更像是一個工具,後臺通過這個工具告訴你,你成功了抑或是失敗了。這裡面的所有非同步操作都和回撥沒關係,真正的非同步是then方法。
到此這篇關於JS中的 回撥函數(callback)的文章就介紹到這了,更多相關js 回撥函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45