<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
建立一個純函數的快取版本
主要用途:優化效能——對於之前運算過一次的內容,利用閉包原理,快取起來,避免重複呼叫,造成效能的浪費
/** * Create a cached version of a pure function. */ function cached (fn) { var cache = Object.create(null); return (function cachedFn (str) { var hit = cache[str]; return hit || (cache[str] = fn(str)) }) }
這一段的原始碼很短,但是在原始碼中使用了19處!這就顯得這個函數很重要了
fn
:(函數型別)
用於執行需要快取的方法
str
:字串型別
傳入函數fn中的引數
型別為:函數型別
首先通過Object.create
建立一個乾淨的空物件出來
然後直接返回一個函數(cachedFn
)
函數內首先定義變數,通過傳入的引數str去存取建立出來的cache
物件
fn
函數,並把函數返回值賦值給cache
物件這樣可能比較抽象,我們直接做一個實驗,同樣直接在瀏覽器中做
這一次,我們直接在瀏覽器的原始碼中做——debug
function cached(fn) { var cache = Object.create(null) return( function cachedFn(str) { var hit = cache[str]; return hit || (cache[str] = fn(str)); } ) } var capitalize = cached(function(str) { return str.charAt(0).toUpperCase() + str.slice(1); }) console.log(capitalize("abc"),"第一次存取") console.log(capitalize("abc"),"第二次存取")
直接打一個斷點,看看會發生什麼
執行第一次
在第一次執行時,發現cache是一個空的object,然後直接進入了立即執行函數cacheFn
中
這裡立即執行函數的作用就是
建立新的作用域,隔離變數——於將var使用變為let
效果一致
str值為abc
,也就是傳入引數fn中的引數
下一步執行,當然就是執行fn函數了
我們可以看到這裡的fn函數就是對應capitalize
中的function,將str的引數傳進來
執行的結果就是Abc
右邊執行完成後,賦值給左側的cache[str]
這裡的程式碼可以翻譯成,或許更好理解
cache[str] = "Abc"
也就是說,這裡相當於通過方括號屬性存取器,建立了一個不存在的屬性abc
,對應的值是fn返回的Abc
在右側監視的cache
也明顯的多出了一個屬性abc
執行第二次
此時我們看見,cache此時是具有屬性abc
的,因此hit的值不再是undefined
第二次時,很明顯的我們可以看見執行過程,沒有再次呼叫fn函數,也就是說沒有呼叫capitalize
中的函數,而是直接獲取的快取。
從而也就做到了對效能的優化。
為什麼cache是有效的,每次呼叫函數的時候不都建立了新的嗎?
這裡其實使用的是閉包的特性。
在呼叫cached函數時,會在當前函數建立一個cache物件
也就是說,其實cache物件是屬於當前範例中的capitalize
這個我們可以直接在屬性中看出來
我們重新debug一次,這一次關注capitalize
中的值
第一次執行時
第二次執行時
在執行完cache[str] = fn(str)
後,發現的確這裡的值增加了一個
因此,我們可以得出結論。
小結:
在每一次呼叫cached
時,由於閉包函數的特性,使得cached中的變數值不會被清空,而且這個值是在對應的處理方法中的。
因為cache物件是在內部建立的,所以每次呼叫cached都將是不同的object
各自擁有獨立的快取空間,而不是全域性共用一個
到此這篇關於Vue原始碼cached解析的文章就介紹到這了,更多相關Vue cached內容請搜尋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