目錄
回呼函數
為什麼需要回呼函數
匿名函數
閉包
首頁 微信小程式 小程式開發 微信小程式開發基礎篇之回呼函數,匿名函數,閉包(4)

微信小程式開發基礎篇之回呼函數,匿名函數,閉包(4)

Apr 25, 2017 am 09:25 AM

嚴格來說,這不能算是一篇微信小程式教程,不過會使用到上一篇中的app.js程式碼作為範例,姑且充個數吧。

回呼函數

回呼函數,對於初入程式設計這一行的同學可能會有些難以理解,畢竟回呼函數的使用和程式順序執行的直覺流程是相悖的。

想像你訂了一個外賣,一種是你定時去查看外賣有沒有到,一種是你出示電話號碼給外賣員,到達的時候電話通知你。

很容易可以看出第二種是更有效率的方案,其實這種通知機制被應用在程式設計領域,就是回呼函數了。

熟悉win32開發的同學應該知道,典型的windows程式框架就是一個訊息循環外加一個視窗過程函數。其中windows系統接管訊息接受,之後呼叫開發者的視窗過程函數來完成具體的訊息處理邏輯。視窗過程函數就是一個回呼函數。

為什麼需要回呼函數

以上面的 win32程式為例。我們知道出於安全性考慮,windows作業系統是不允許開發者直接存取硬體資源的。微軟的開發者提供了api來處理訊息循環,但是具體訊息的回應邏輯需要開發者來提供,這種情況下,回呼函數就是很好的實作方案。

再舉一個例子,想像你參與一個手機設備管理軟體專案的開發工作,你負責底層設備通訊模組。當使用者插入設備到電腦中時,你需要通知上層的模組進行處理。出於靈活性和通用性的考慮,你不可能將裝置連接時的處理邏輯放在你負責的模組中,此時可以由上層呼叫者提供一個回調函數,在裝置連接時你的模組呼叫回調函數即可。

關於回呼函數,有一個所謂的好萊塢準則:Don't call me; I'll call you!

匿名函數

在c,c++等語言中,當需要使用回呼函數時,需要預先定義一個函式體。而回調函數通常只是提供給其它模組進行調用,為了簡化編碼,後續的javascript等腳本語言中提供了對匿名函數的支援。 (註: 新的c++標準也開始支援匿名函數,稱為Lambda函數)

getUserInfo:function(cb){
    var that = this
    if(this.globalData.userInfo){
      typeof cb == "function" && cb(this.globalData.userInfo)
    }else{
      //调用登录接口
      wx.login({
        success: function () {
          wx.getUserInfo({
            success: function (res) {
              that.globalData.userInfo = res.userInfo
              typeof cb == "function" && cb(that.globalData.userInfo)
            }
          })
        }
      })
    }
  },
登入後複製

上面的程式碼來自於上一篇教學中的app.js,在呼叫wx.login時,傳遞了一個匿名函數進行呼叫成功後的邏輯處理,就是success後面的部分。可以看到這裡只有函數定義而沒有函數名稱,因此除了作為回調函數外,也無法在其它地方呼叫該函數。

其實匿名函數只是一種編碼簡化而已,不過它帶來的好處卻不只是減少編碼而已。

閉包

在程式設計技術中,閉包應該屬於較高階的技術了。
當使用回呼函數時,通常會涉及一些上下文的傳遞。在c/c++等語言中,會使用全域變數或堆記憶體來傳遞上下文。全域變數的缺點很明顯,而堆記憶體又很容易發生記憶體洩漏。而在更高階的腳本語言中,可以透過閉包技術來輕鬆的完成上下文傳遞。

以上面的程式碼為例,在回呼函數中執行了that.globalData.userInfo = res.userInfo來保存使用者訊息,其中that變數由var that = this賦值,因此該變數指向app物件本身,所以才能成功儲存使用者資訊。

我們可以看到that物件是getUserInfo方法堆疊上的變量,如果沒有閉包技術,此處的匿名回呼函數是不能直接使用that變數的,就需要將app物件傳遞給回調函數(全域變數或函數參數的方式),而在閉包技術的支持下,回調函數可以像使用函數內部變數一樣來存取that變量,語法上便捷了許多。

以上是微信小程式開發基礎篇之回呼函數,匿名函數,閉包(4)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C++ lambda 表達式中閉包的意思是什麼? C++ lambda 表達式中閉包的意思是什麼? Apr 17, 2024 pm 06:15 PM

在C++中,閉包是能夠存取外部變數的lambda表達式。若要建立閉包,請擷取lambda表達式中的外部變數。閉包提供可重複使用性、資訊隱藏和延遲求值等優點。它們在事件處理程序等實際情況中很有用,其中即使外部變數被銷毀,閉包仍然可以存取它們。

C++ 匿名函式的用法和特點 C++ 匿名函式的用法和特點 Apr 19, 2024 am 09:03 AM

匿名函數,又稱lambda表達式,是一種不指定名稱的函數,用於一次性使用或傳遞函數指標。特點有:匿名性、一次性使用、閉包、回傳類型推論。實戰中常用於排序或其他一次性函數呼叫。

C++ 函式中閉包的優點和缺點是什麼? C++ 函式中閉包的優點和缺點是什麼? Apr 25, 2024 pm 01:33 PM

閉包是一種巢狀函數,它能存取外層函數作用域的變量,優點包括資料封裝、狀態保持和靈活性。缺點包括記憶體消耗、效能影響和調試複雜性。此外,閉包還可以建立匿名函數,並將其作為回調或參數傳遞給其他函數。

C++ Lambda 表達式如何實作閉包? C++ Lambda 表達式如何實作閉包? Jun 01, 2024 pm 05:50 PM

C++Lambda表達式支援閉包,即保存函數作用域變數並供函數存取。語法為[capture-list](parameters)->return-type{function-body}。 capture-list定義要捕獲的變量,可以使用[=]按值捕獲所有局部變量,[&]按引用捕獲所有局部變量,或[variable1,variable2,...]捕獲特定變量。 Lambda表達式只能存取捕獲的變量,但無法修改原始值。

golang函數閉包在測試中的作用 golang函數閉包在測試中的作用 Apr 24, 2024 am 08:54 AM

Go語言函數閉包在單元測試中發揮著至關重要的作用:捕獲值:閉包可以存取外部作用域的變量,允許在巢狀函數中捕獲和重複使用測試參數。簡化測試程式碼:透過擷取值,閉包消除了對每個循環重複設定參數的需求,從而簡化了測試程式碼。提高可讀性:使用閉包可以組織測試邏輯,使測試程式碼更清晰、更易於閱讀。

PHP 函數的鍊式呼叫與閉包 PHP 函數的鍊式呼叫與閉包 Apr 13, 2024 am 11:18 AM

是的,可以透過鍊式呼叫和閉包優化程式碼簡潔性和可讀性:鍊式呼叫可將函數呼叫連結為一個流暢介面。閉包可建立可重複使用程式碼區塊,並在函數外部存取變數。

函數指標和閉包對Golang效能的影響 函數指標和閉包對Golang效能的影響 Apr 15, 2024 am 10:36 AM

函數指針和閉包對Go性能的影響如下:函數指針:稍慢於直接調用,但可提高可讀性和可復用性。閉包:通常更慢,但可封裝資料和行為。實戰案例:函數指標可最佳化排序演算法,閉包可建立事件處理程序,但會帶來效能損失。

Golang 匿名函數可以傳回多個值嗎? Golang 匿名函數可以傳回多個值嗎? Apr 13, 2024 pm 04:09 PM

是的,Go語言中的匿名函數可以傳回多個值。語法:func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//函數體}。使用方法:使用:=運算元接收回傳值;使用return關鍵字傳回多個值。

See all articles