摘要:面對這種問題的解決方法是采用回調(diào)模式,可以將因此節(jié)點邏輯以回調(diào)函數(shù)方式傳遞給并委托執(zhí)行下面是栗子。解決的方法有另外傳遞該回調(diào)函數(shù)的所屬對象。
什么是回調(diào)函數(shù)本文章記錄本人在學(xué)習(xí) JavaScript 中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復(fù)習(xí)。
在js里函數(shù)都是對象,這表示它們可以作為參數(shù)傳遞給其他的函數(shù)。舉例:當(dāng)函數(shù)b()作為參數(shù)傳遞給函數(shù)a(),那么在某一時刻函數(shù)a()可能會執(zhí)行或者調(diào)用函數(shù)b()。這種情況下,函數(shù)b()就被稱為回調(diào)函數(shù),也可以簡稱叫做回調(diào)(下面是栗子)。
JavaScript"use strict"; function a(callback) { callback(); } function b() { console.log("hello callback"); } a(b); // 注意 b() 作為參數(shù)傳遞給 a() 的時候是不需要帶括號的回調(diào)函數(shù)示例
假設(shè)有一個通用的函數(shù)執(zhí)行一些復(fù)雜的處理工作,并且返回結(jié)果為一個大塊數(shù)據(jù)(下面是栗子)。
JavaScriptvar findeNodes = function () { var i = 10000, node = [], found; while (i) { i -= 1; node.push(found); } return nodes; }
上面代碼定義函數(shù)findNodes(),它的任務(wù)是抓取頁面的dom tree,并返回一個你要的頁面元素數(shù)組。
在定義一個函數(shù)hide(),顧名思義它的作用是隱藏頁面中的節(jié)點(下面是栗子)。
JavaScriptvar hide = function (nodes) { for (var i = 0; i < nodes.length; i += 1) { nodes[i].style.display = "block"; } } // 執(zhí)行函數(shù) hide(findeNodes());
好了,要的效果都實現(xiàn)了,但是實現(xiàn)卻是低效的。因為hide()必須再次循環(huán)由findNodes()返回的數(shù)組節(jié)點。如果能避免這種循環(huán),只需要在findNodes()中選擇便可隱藏節(jié)點,那么這將是更高效的方式。但是如果在findNodes()中實現(xiàn)隱藏邏輯的話,由于檢索和修改邏輯耦合,那么他不再是通用的函數(shù)。面對這種問題的解決方法是采用回調(diào)模式,可以將因此節(jié)點邏輯以回調(diào)函數(shù)方式傳遞給findNodes()并委托執(zhí)行(下面是栗子)。
JavaScript// 重構(gòu) findeNodes() 函數(shù),并接受一個回調(diào)函數(shù) var findeNodes = function (callback) { var i = 10000, nodes = [], found; while (i) { i -= 1; // 現(xiàn)在運行回調(diào)函數(shù) if (typof callback === "function") { callback(); } nodes.push(found); } return found; }
上面的代碼只是做了對callback是否存在進行了判斷,如果存在的話嗎,那么就執(zhí)行該函數(shù)。其中,回調(diào)函數(shù)是可選的,因此后續(xù)的findeNodes()仍然可以想以前一樣使用,而不會破壞以來舊API的原始代碼。
現(xiàn)在hide的實現(xiàn)就簡單多了,因為它不需要再去循環(huán)遍歷所有的節(jié)點了(下面是栗子)。
JavaScript// 回調(diào)函數(shù) var hide = function (nodes) { nodes.style.display = "none"; } // 找到指定的節(jié)點,并在后續(xù)執(zhí)行中隱藏 findeNodes(hide);回調(diào)函數(shù)與作用域
在上一個栗子中,回調(diào)函數(shù)執(zhí)行的語句是這樣的:callback(parameters)。
雖然上面那句在大多數(shù)的場景上都是有效的,但是總會有一些場景,其回調(diào)函數(shù)并不是一次性的匿名函數(shù)或者全局函數(shù),而是對象的方法。如果該函數(shù)使用this來引用它所的屬性,這可能有是一個坑了(下面是栗子)。
JavaScript// 假設(shè)回調(diào)函數(shù)是 paint(),它是一個名為 myapp 的對象的方法 var myapp = {}; myapp.color = "green"; myapp.paint = function (nodes) { nodes.style.color = this.color; } // 然后用到上一個栗子的 findeNodes() findeNodes(myapp.paint); //
坑:this.color沒有被定義,因為findeNods()是一個全局函數(shù),因此,對象的this是指向window的。
解決的方法有:
另外傳遞該回調(diào)函數(shù)的所屬對象。這樣就需要修改一下findNodes()函數(shù)(下面是栗子)。
JavaScriptvar findNodes = function (callback, callback_obj) { // ... if (typof callback === "function") { callback.call(callback_obj, found); } // ... } // 執(zhí)行函數(shù) findNodes(myapp.paint, myapp);
主要是通過call、apply來修改函數(shù)運行時的this指向。
然后接著修改上面的方法,將方法作為字符串傳遞,因此就不用兩次輸入該對象的名稱(下面是栗子)。
JavaScriptvar findNodes = function (callback, callback_obj) { // ... if (typof callback === "string") { callback = callback_obj[callback]; } // ... if (typof callback === "function") { callback.call(callback_obj, found); } // ... } // 執(zhí)行函數(shù) findNodes("paint", myapp);
最后,如果文章有什么錯誤和疑問的地方,請指出。與sf各位共勉!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85780.html
摘要:如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點加載會阻塞頁面加載默認異步加載文件方法一把放到頁面底部加載方法二支持定義全局相對路徑方法一自定義屬性指定網(wǎng)頁程序的主模塊文件定義整個網(wǎng)頁代碼的入口文件的相對位置,以后此文件 如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點; js加載會阻塞頁面加載: //requirejs默認異步加載js文件; 方法一...
摘要:的學(xué)習(xí)筆記是異步和的縮寫,它的作用是執(zhí)行異步的網(wǎng)絡(luò)請求。這就是一個格式的,向這個地址請求,將得到一個回調(diào)函數(shù),執(zhí)行就得到數(shù)據(jù)。 AJAX的學(xué)習(xí)筆記 AJAX是異步JavaScript和XML的縮寫,它的作用是執(zhí)行異步的網(wǎng)絡(luò)請求。因為JS是線性同步,如果需要用戶向瀏覽器發(fā)送一個請求,那么就需要等瀏覽器接收到了結(jié)果才能繼續(xù)運行,如果發(fā)送到接受的時間太長,瀏覽器就會很長時間處于假死狀態(tài),這樣...
摘要:它通過數(shù)據(jù)模型進行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進行事件處理及與現(xiàn)有的通過接口進行交互。 本人兼職前端付費技術(shù)顧問,如需幫助請加本人微信hawx1993或QQ345823102,非誠勿擾 1.為初學(xué)前端而不知道怎么做項目的你指導(dǎo) 2.指導(dǎo)并扎實你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見 4.為你的前端之路提供極具建設(shè)性的...
摘要:觀察者模式也稱發(fā)布訂閱模式它的作用就是當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,自動刷新對象狀態(tài)舉個生活比較常見常見的例子比如你去面試之后,面試官看你表現(xiàn)不錯,最后會跟你要聯(lián)系方式,以便之后可以聯(lián)系你。 觀察者模式也稱發(fā)布-訂閱模式,它的作用就是當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,自動刷新對象狀態(tài) 舉個生活比較常見常見的例子,比如你去面試之后,...
摘要:回調(diào)函數(shù)成功回調(diào)處理器失敗回調(diào)處理器用戶發(fā)送一個向百度服務(wù)器獲取數(shù)據(jù)的異步請求無阻塞高并發(fā)的的誕生更加嚴(yán)重的依賴異步操作才能完成無阻賽高并發(fā)的特性。 Promise Promise 是什么? 詞語本意: 發(fā)音:[?pr?m?s] 詞性:名詞, 翻譯:許諾,允諾。 MDN解釋 Promise 對象用于一個異步操作。 一個Promise表示一個現(xiàn)在,將來或永不可能可用的值。 按照書寫方...
閱讀 640·2021-10-13 09:39
閱讀 1449·2021-09-09 11:53
閱讀 2639·2019-08-29 13:55
閱讀 722·2019-08-28 18:08
閱讀 2586·2019-08-26 13:54
閱讀 2406·2019-08-26 11:44
閱讀 1835·2019-08-26 11:41
閱讀 3761·2019-08-26 10:15