爲了講明白這個概念,假設你在開發一個天氣app。開始你不知道怎麼作,正好有一個npm包裏有一個getChanceOfRain
的方法能夠調用:npm
import { getChangeOfRain } from 'magic-weather-calculator'; function showWeatherReport() { let result = getChangeOfRain(); // 這裏調用 console.log('The change of rain tomorrow is: ', result); }
只是這樣會遇到一個問題。不管你作什麼,只要調用這個方法就會消耗100毫秒。因此,若是某個用戶瘋狂點擊「顯示天氣」按鈕,每次點擊app都會有一段時間沒有響應。緩存
showWeatherReport(); // 觸發計算 showWeatherReport(); // 觸發計算 showWeatherReport(); // 觸發計算
這很不理性。在實際開發中,若是你已經知道結果了,那麼你不會一次一次的計算結果。重用上次的結果纔是上佳選擇。這就是函數緩存。函數緩存也就是緩存函數的結算結果,這樣就不須要一次一次的調用函數。app
在下面的例子裏,咱們會調用memoizedGetChangeOfRain()
。在這個方法裏咱們會檢查一下是否已經有結果了,而不會每次都調用getChangeOfRain()
方法:函數
import { getChangeOfRain } from 'magic-weather-calculator'; let isCalculated = false; let lastResult; // 添加這個方法 function momoizedGetChangeOfRain() { if (isCalculated) { // 不須要在計算一次 return lastResult; } // 第一次運行時計算 let result = getChangeOfRain(); lastResult = result; isCalculated = true; return result; } function showWeatherReport() { let result = momoizedGetChangeOfRain(); console.log('The chance of rain tomottow is:', result); }
不過這個也不是沒事就要用的。只有在狀況容許的時候採用。並且要肯定使用了以後有了性能的明顯提高。性能
原文地址:https://whatthefork.is/memoiz...code