如果有人能夠以簡單的方式逐步解釋發生的事情,這將非常有幫助。我知道memoize()
緩存的功能,但我需要更好的理解。謝謝!任何人都可以解釋下面使用JS和memoization技術的代碼中發生了什麼
var memoize = function (f) {
var cache = {};
return function() {
var str = JSON.stringify(arguments);
cache[str] = cache[str] || f.apply(f, arguments);
return cache[str];
};
};
var mUser = memoize(function(x){
return function() {
return x;
};
});
var x = mUser(1);
var y = mUser(2);
console.log(x()); //1
console.log(y()); //2
編輯:我保留原始記錄。但發佈修改後的代碼和我對它的理解。我需要意見,如果我是對還是錯,以及一些解釋。
var memoize = function (injected) {
var cache = {};
return function closure_with_access_to_cache() {
var str = JSON.stringify(arguments);
cache[str] = cache[str] || injected.apply(injected, arguments);
console.log(cache);
return cache[str];
};
};
var memoizeUser = memoize (function injected(a) {
return function closure_with_access_to_a() {
return a;
};
});
memoizeUser();
讓我們嘗試回溯事情。
首先,當memoizeUser();
語句正在執行時,memoizeUser
表示的是什麼或者哪個函數首先被調用?
var memoizeUser = ...
是一個函數表達式,意味着它不會被掛起。因此,memoize
被調用。
但是,var memoize = ...
也是一個函數表達式。仔細看一下,它是一個關閉closure_with_access_to_cache
並在調用時接收傳遞給memoizeUser
的參數。
在這個closure_with_access_to_cache
裏面,第一次,cache
是空的,所以injected.apply(injected, arguments)
被執行並得到另一個關閉closure_with_access_to_a
作爲返回值。該值存儲到cache
,然後返回。因此,memoizeUser
實際上變成了closure_with_access_to_a
而a
等於傳遞給memoizeUser
的值。
讓我們來看看一些調用和日誌。
console.log(memoizeUser());
{ '{}': [Function: closure_with_access_to_a] }
[Function: closure_with_access_to_a]
緩存關鍵是因爲沒有被作爲PARAM傳遞給memoizeUser()
空對象。 memoizeUser()
返回記錄的功能closure_with_access_to_a
。
console.log(memoizeUser()());
{ '{}': [Function: closure_with_access_to_a] }
undefined
memoizeUser()
回報功能closure_with_access_to_a
被稱爲和記錄不確定這是的a
值作爲什麼傳遞給memoizeUser
。
memoizeUser(1);
{ '{"0":1}': [Function: closure_with_access_to_a] }
和上面一樣,除了a
過的1
console.log(memoizeUser(1)());
{ '{"0":1}': [Function: closure_with_access_to_a] }
1
和上面一樣,除了價值有a
1.
可能看看地圖s和其餘params,它使東西更加防彈... –
@Jonasw感謝您的建議! –