摘要:而回調函數通常只是提供給其它模塊進行調用,為了簡化編碼,后續的等腳本語言中提供了對匿名函數的支持。當使用回調函數時,通常會涉及到一些上下文的傳遞。
嚴格來說,這不能算是一篇微信小程序教程,不過會使用到上一篇中的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變量,語法上便捷了許多。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80969.html
摘要:微信小程序框架提供了一系列來幫助我們進行本地數據存儲,上面的代碼中使用到了和兩個更多相關可以參考這里方法很容易理解,會執行獲取用戶信息的功能。 上一篇教程中寫道,開發工具會生成一個默認的程序框架,其中程序的主流程代碼包含在app.js中。默認實現中,該部分功能比較簡單,不過對于學研究小程序開發還是比較有價值的。 由于代碼行數不多,下面一次性貼出來后進行講解 //app.js App({...
摘要:上一篇教程談了些和微信小程序開發本身無關的技術問題,現在回到主題。這邊教程主要對默認生成的頁面進行講解。而的顯示則是由屬性直接指定。在該例子中,當用戶點擊用戶頭像和昵稱的視圖區域時,程序便會顯示頁面。 上一篇教程談了些和微信小程序開發本身無關的技術問題,現在回到主題。 這邊教程主要對默認生成的index 頁面進行講解。在之前的教程中有寫道,每一個頁面都包含.js(處理邏輯),.wxml...
摘要:在新建一個項目后,微信小程序會生成一個默認的程序框架,后續程序的開發工作都在這個框架上進行。微信小程序的開發模式確實和開發很相似。通常一個完整的微信小程序包含上面兩部分,當然我們也可以定義自己的目錄用于存放公共代碼和程序需要的其它文件。 在上一篇教程的最后,我們生成了一個類似Hello World的小程序,這個過程中沒有編寫任何一行代碼。在新建一個項目后,微信小程序會生成一個默認的程序...
摘要:在之前的教程中寫到,微信小程序框架將程序分為邏輯層文件和視圖層文件。關于數據綁定的更多講述,敬請期待微信小程序開發教程基礎篇數據綁定下 在之前的教程中寫到,微信小程序框架將程序分為邏輯層(.js文件)和視圖層(.wxml文件)。這是一種常見的UI和邏輯分離的程序設計方式,開發出來的程序更加靈活,易擴展。 這種程序設計方式通常要解決兩個問題: UI層響應邏輯層邏輯和數據的變化UI層將用戶...
閱讀 961·2021-11-24 09:39
閱讀 3383·2021-10-27 14:20
閱讀 2322·2019-08-30 14:08
閱讀 3361·2019-08-29 16:34
閱讀 2176·2019-08-26 12:14
閱讀 2104·2019-08-26 11:54
閱讀 2772·2019-08-26 11:44
閱讀 2474·2019-08-26 11:38