亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript Memoizer淺析

2019-11-20 14:02:23
字體:
來源:轉載
供稿:網友

以下來自John Hann的實現,這段代碼引起了我的注意,它用巧妙的方法把方法調用的結果緩存起來了。

代碼解析:

復制代碼 代碼如下:

// memoize: 使用memoization來緩存的通用方法
// func: 要被緩存的方法
// context: 方法執行上下文
// Note: 方法必須是外部可訪問的,參數是可字符序列化的
function memoize (func, context) {
    function memoizeArg (argPos) { //參數表示原始方法中參數的位置
        var cache = {}; //這個緩存的key是參數,value是執行結果
        return function () { //返回一個函數閉包
            if (argPos == 0) { //第一個參數,如果參數在緩存的key中不存在,就執行原始函數并且存儲執行結果
                if (!(arguments[argPos] in cache)) {
                    cache[arguments[argPos]] = func.apply(context, arguments);
                }
                return cache[arguments[argPos]];
            }
            else { //不是第一個參數,如果參數在緩存的key中不存在,就遞歸執行memoizeArg方法,原始方法中參數的位置-1
                if (!(arguments[argPos] in cache)) {
                    cache[arguments[argPos]] = memoizeArg(argPos - 1);
                }
                return cache[arguments[argPos]].apply(this, arguments);
            }
        }
    }
    var arity = func.arity || func.length; //func參數的長度,javascript中用length屬性,其它的用arity屬性
    return memoizeArg(arity - 1); //從最后一個參數開始遞歸
}

使用:

復制代碼 代碼如下:

var mem = memoize(func, this);  
alert(mem.call(this,1,1,2));  
alert(mem.call(this,2,1,2));  
alert(mem.call(this,3,1,3));  
alert(mem.call(this,2,2,4));

看似簡單,再一看好像也并不易懂,可是如果能對閉包的使用比較熟悉的話,就很好理解了。經過上面幾次mem.call的調用之后,形成的是一棵樹,每個節點都是一個閉包,每個閉包內有一個cache,每個cache的key都是樹分支:

(注:上面圖中的“結果”也是一個閉包,只不過argPos為0而已)

不過方法有諸多,比如limboy說:

復制代碼 代碼如下:

function Memoize(fn){
    var cache = {};
    return function(){
        var key = [];
        for( var i=0, l = arguments.length; i < l; i++ )
            key.push(arguments[i]);
        if( !(key in cache) )
            cache[key] = fn.apply(this, arguments);
        return cache[key];
    };
}

實現更簡易,不過把參數push到一個數組內,再把數組當key,而key是只支持字符串型的,因此這點在使用上需要注意(比如一個對象tostring之后可能只看到”[object Object]“了),它的功能比上面那個要弱一些。

改進這一點也不難,把參數另立一個對象即可,而原cache對象和這個另立的參數對象使用一個ID關聯起來:

復制代碼 代碼如下:

function Memoize(fn){
    var cache = {}, args = {};
    return function(){
        for( var i=0, key = args.length; i < key; i++ ) {
            if( equal( args[i], arguments ) )
                return cache[i];
        }
        args[key] = arguments;
        cache[key] = fn.apply(this, arguments);
        return cache[key];
    };
}

還有一些其他的辦法,都可以寫成簡潔的函數式方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av片永久免费网站| 精品国产一区二区三区久久久狼| 中文字幕欧美日韩精品| 日韩中文在线中文网在线观看| 视频在线一区二区| 国产丝袜一区二区三区| 国产99久久精品一区二区永久免费| 日本不卡免费高清视频| 九色精品免费永久在线| 97久久精品人搡人人玩| 国产精品久久二区| 亚洲欧美日韩一区在线| 欧美xxxx做受欧美| 日韩av在线免费看| 国产婷婷色综合av蜜臀av| 亚洲国产高清高潮精品美女| 日韩av片免费在线观看| 亚洲人成绝费网站色www| 日韩在线视频网| 久久伊人精品天天| 91在线观看免费高清完整版在线观看| 亚洲国产精品一区二区久| 欧美高清理论片| 亚洲精品久久久久中文字幕欢迎你| 日本不卡视频在线播放| 欧美日韩亚洲网| 日韩在线不卡视频| 欧美另类在线观看| 日韩a**中文字幕| 亚洲无亚洲人成网站77777| 亚洲香蕉成人av网站在线观看| 国产欧美精品一区二区三区介绍| 国产精品视频播放| 97久久精品人搡人人玩| 亚洲高清免费观看高清完整版| 91国产视频在线播放| 成人免费视频a| 日韩亚洲欧美成人| 亚洲午夜性刺激影院| 国产精品aaa| 欧美老女人在线视频| 国产精品高潮在线| 日韩在线视频二区| 91在线免费网站| 国产精品com| 精品日本高清在线播放| 日韩成人激情在线| 亚洲free性xxxx护士hd| 国外日韩电影在线观看| 蜜月aⅴ免费一区二区三区| 久久这里只有精品99| 色青青草原桃花久久综合| 日韩精品在线第一页| 国模极品一区二区三区| 伊人青青综合网站| 国产精品久久久久91| 啪一啪鲁一鲁2019在线视频| 国产一区二区在线免费视频| 欧美高清一级大片| 日韩av在线免费观看一区| 亚洲aⅴ男人的天堂在线观看| 91沈先生作品| 亚洲一区二区三| 国产精品中文在线| 日韩久久精品电影| 欧美中文在线视频| 国产精品国产自产拍高清av水多| 91视频国产一区| 国产精品视频网址| 国产精品91久久| 91大神在线播放精品| 欧美自拍视频在线观看| 91视频88av| 国产精品av在线播放| 久久精品色欧美aⅴ一区二区| 欧美中文字幕在线播放| 欧美亚洲另类激情另类| 欧美国产一区二区三区| 欧美丝袜第一区| 亚洲欧美在线看| 久久躁日日躁aaaaxxxx| 青青a在线精品免费观看| 国产精品高潮呻吟久久av野狼| 国产精品国语对白| 久久免费在线观看| 欧美在线性视频| 在线日韩日本国产亚洲| 久热精品视频在线观看一区| 精品久久久中文| 亚洲一区二区久久久久久久| 日韩中文字幕精品| 欧美激情精品久久久久久黑人| 亚洲区一区二区| 欧美精品在线免费播放| 欧美日韩成人在线播放| 亚洲国产又黄又爽女人高潮的| 大胆人体色综合| 亚洲精品国产成人| 欧美在线视频免费播放| 欧美成人黑人xx视频免费观看| 国产精品免费视频久久久| 欧美夫妻性生活xx| 久久精品国产电影| 精品视频久久久久久| 亚洲精品www| 色婷婷av一区二区三区在线观看| 成人免费淫片视频软件| 久久精品99国产精品酒店日本| 国产精品99蜜臀久久不卡二区| 亚洲香蕉成人av网站在线观看| 91在线免费网站| 有码中文亚洲精品| 久久久影视精品| 日韩亚洲综合在线| 亚洲天堂久久av| 亚洲国产欧美一区二区丝袜黑人| 国产欧美韩国高清| 91精品久久久久久久久久久久久| 久久精品99无色码中文字幕| 中文字幕av一区中文字幕天堂| 欧美区在线播放| 高清欧美一区二区三区| 国产精品免费看久久久香蕉| 亚洲网站在线播放| 欧美成人中文字幕| 一区二区三区日韩在线| 日本一区二区三区四区视频| 韩国视频理论视频久久| 日韩理论片久久| 欧美高跟鞋交xxxxhd| 亚洲天天在线日亚洲洲精| 夜夜狂射影院欧美极品| 欧美区二区三区| 2021国产精品视频| 永久555www成人免费| 日本久久久久亚洲中字幕| 亚洲欧美日韩国产中文专区| 日本不卡高字幕在线2019| 久久6免费高清热精品| 国产成人鲁鲁免费视频a| 国产一区二区三区在线免费观看| 欧美性xxxx| 岛国视频午夜一区免费在线观看| 国产精品亚洲欧美导航| 亚洲性线免费观看视频成熟| 国产精品久久久亚洲| 欧美夫妻性视频| 国产精品第100页| 欧美超级乱淫片喷水| 亚洲一区二区自拍| 国产91网红主播在线观看| 激情成人在线视频| 亚洲97在线观看| 国产精品入口日韩视频大尺度| 欧美大片网站在线观看| 欧美精品日韩www.p站| 爽爽爽爽爽爽爽成人免费观看| 国产成人a亚洲精品| 亲爱的老师9免费观看全集电视剧| 国产亚洲福利一区| 国产成人一区二区在线| 欧美一级淫片播放口| 国产在线精品成人一区二区三区| 成人精品视频在线|