摘要:函數調用會在內存形成一個調用記錄,又稱調用幀,保存調用位置和內部變量等信息。等到運行結束,將結果返回到,的調用幀才會消失。在進入內層函數的時候,可以直接用內層函數的調用幀替換掉外層函數的調用幀,從而大大減少內存占用。
昨晚翻了一下,雖然都是一些舊知識,不過深入下去對照著其他資料一起看,還是能發現一些有意思的地方。
函數式編程反正之前我是沒搞懂函數式和命令式的區別,也很疑惑函數式編程中,如果出現分支怎么辦,昨晚總算弄明白了。
// 我們有4個基礎函數,會根據不同的業務邏輯進行組裝使用 // 自動創建 function autoCreate () {} // 自動同步 function autoSync () {} // 流程 A function processA () {} // 流程 B function processB () {} // 流程 A 與流程 B 在業務上是互斥的
傳統的命令式編程,我們會這樣寫業務邏輯
function service (errorHandler) { var result; if (!id) { result = autoCreate(); if (result.error) { errorHandler(result); } } if (type === "a") { processA(); if (result.error) { errorHandler(result); } } if (type === "b") { result = processB(); if (result.error) { errorHandler(result); } } if (!isSync) { result = autoSync(); if (result.error) { errorHandler(result); } } }
而函數式編程,我們則可以這樣寫業務邏輯。
// service 本身不是一個異步業務,所以直接使用 Promise.resolve() var service = Promise.resolve(); // 需要對autoCreate()等四個基礎函數做 Promise 改造 service.then(autoCreate) .then(processA) .then(processB) .then(autoSync) .catch(errorHandler);
這里可能會有一個疑惑,互斥的 processA 和 processB 怎么進入了同一個處理流程,這樣和需求就不符合了?
在這種情況下,我們還需要在 processA 和 processB 的內部,把退出條件補上。
function processA () { return new Promise(function(resolve, reject){ if (type !== "A") { resolve(); } // 這里繼續 processA 的邏輯代碼 }); }調用棧
JS 在執行的時候,有一個函數調用棧,棧里面放著一個個的函數調用幀,這些幀保存著所屬函數所需的所有變量信息。
瀏覽器攔截 window.open函數調用會在內存形成一個“調用記錄”,又稱“調用幀”(call
frame),保存調用位置和內部變量等信息。如果在函數A的內部調用函數B,那么在A的調用幀上方,還會形成一個B的調用幀。等到B運行結束,將結果返回到A,B的調用幀才會消失。如果函數B內部還調用函數C,那就還有一個C的調用幀,以此類推。所有的調用幀,就形成一個“調用?!保╟all
stack)。
我們發現有時候執行 window.open(),能正常打開新窗口或者新的標簽頁,而有時卻又不行,會被瀏覽器攔截。
其原因是瀏覽器會根據當前調用棧,找到最初的caller,如果不是用戶觸發的,則攔截。
尾調用優化由于函數調用的時候會生成新的調用幀,當遞歸調用的時候,調用棧中的調用幀增長會非常厲害,最終導致內存耗盡而觸發 RangeError。
如果把函數調用放在函數塊的最后一條語句,且不在使用外層函數的變量了,則外層函數所占用的調用幀已無存在意義。在進入內層函數的時候,可以直接用內層函數的調用幀替換掉外層函數的調用幀,從而大大減少內存占用。
其他Partial Application 的模式,用來做 Library 和 SDK 都挺好的。一個可定制性高的底層接口,再通過類似 _.partial() 的方式,提供一個開箱即用的上層接口。就像 $.ajax() 和 $.get() 一樣。
_.defer() 和 _.memoize() 可以用在有大運算量的業務場景。
同步于我的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86549.html
摘要:計算機科學中最常見的兩種數據結構是單鏈表和雙鏈表。雙向鏈表雙向鏈表具有單鏈表的所有功能,并將其擴展為在鏈表中可以進行雙向遍歷。雙向鏈表的操作我們的鏈表將包括兩個構造函數和。與單鏈表不同,雙向鏈表包含對鏈表開頭和結尾節點的引用。 翻譯:瘋狂的技術宅英文:https://code.tutsplus.com/art...說明:本文翻譯自系列文章《Data Structures With Ja...
摘要:你已經聽說過上下文參數,但是還沒有碰到使用的場合。傳遞一個選擇器表達式,一個對象,一個集合,或者一個節點給上下文參數,將盡在這個上下文中搜索元素。 你已經聽說過上下文參數,但是還沒有碰到使用的場合。再想$()中,傳遞選擇器的時候,可以傳遞第二個參數,指定上下文,jQ將在這個上下文中搜索匹配選擇器表達式的元素,上下文參數可能是利用最不充分的JQ功能,其用法非常簡單。傳遞一個選擇器表達式,...
摘要:在上一篇文章中,我們了解了隊列和棧的描述,現在讓我們來了解一下單鏈表和雙向鏈表的實現。單鏈表和雙向鏈表具有以下特點可動態分配空間,但不能隨機訪問。 在上一篇文章中,我們了解了隊列和棧的JavaScript描述,現在讓我們來了解一下 單鏈表 和雙向鏈表 的實現。本文的代碼并非所有都由本人所寫,只是出于學習目的,在此分享出來,并加上一定的解釋,便于大家學習。 本系列文章的代碼可在ht...
摘要:這是我收集的一些資源,分享給大家,全部放在百度網盤,有需要的請轉存到自己的網盤或者下載,以免網盤鏈接失效,另外還有幾百的視頻文件存在網盤,需要的加全部分享在空間,自己可以去下載與權威指南配套源碼禪意花園高清源碼基礎教程權威指南參考手冊鋒利 這是我收集的一些資源,分享給大家,全部放在百度網盤,有需要的請轉存到自己的網盤或者下載,以免網盤鏈接失效,另外還有幾百G的視頻文件存在網盤,需要的加...
摘要:我們很容易修改緩存驅動方式。這樣的話,我們甚至根本不必檢查緩存是否過期。與驅動相比,和的速度更快,所以建議在項目較大時使用外部緩存驅動。結論使用文件數據庫作為驅動,兩者在速度上沒有很明顯的區別。所以投資高速緩存是值得的。 showImg(https://segmentfault.com/img/remote/1460000014057714?w=1440&h=720); 緩存是web開...
閱讀 1310·2021-11-16 11:45
閱讀 2233·2021-11-02 14:40
閱讀 3872·2021-09-24 10:25
閱讀 3029·2019-08-30 12:45
閱讀 1255·2019-08-29 18:39
閱讀 2468·2019-08-29 12:32
閱讀 1588·2019-08-26 10:45
閱讀 1917·2019-08-23 17:01