亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Javascript Memoizer淺析

 更新時(shí)間:2014年10月16日 09:20:37   作者:四火  
這篇文章主要介紹了Javascript Memoizer淺析,Memoizer貌似是一種緩存方法調(diào)用結(jié)果的功能,小編也沒有太懂,需要的朋友參考下吧

以下來自John Hann的實(shí)現(xiàn),這段代碼引起了我的注意,它用巧妙的方法把方法調(diào)用的結(jié)果緩存起來了。

代碼解析:

復(fù)制代碼 代碼如下:

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

使用:

復(fù)制代碼 代碼如下:

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));

看似簡(jiǎn)單,再一看好像也并不易懂,可是如果能對(duì)閉包的使用比較熟悉的話,就很好理解了。經(jīng)過上面幾次mem.call的調(diào)用之后,形成的是一棵樹,每個(gè)節(jié)點(diǎn)都是一個(gè)閉包,每個(gè)閉包內(nèi)有一個(gè)cache,每個(gè)cache的key都是樹分支:

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

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

復(fù)制代碼 代碼如下:

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];
    };
}

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

改進(jìn)這一點(diǎn)也不難,把參數(shù)另立一個(gè)對(duì)象即可,而原cache對(duì)象和這個(gè)另立的參數(shù)對(duì)象使用一個(gè)ID關(guān)聯(lián)起來:

復(fù)制代碼 代碼如下:

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];
    };
}

還有一些其他的辦法,都可以寫成簡(jiǎn)潔的函數(shù)式方法。

相關(guān)文章

  • JavaScript使用指針操作實(shí)現(xiàn)約瑟夫問題實(shí)例

    JavaScript使用指針操作實(shí)現(xiàn)約瑟夫問題實(shí)例

    這篇文章主要介紹了JavaScript使用指針操作實(shí)現(xiàn)約瑟夫問題,實(shí)例分析了javascript模擬數(shù)組指針操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 基于JavaScript實(shí)現(xiàn)自定義滾動(dòng)條

    基于JavaScript實(shí)現(xiàn)自定義滾動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)自定義滾動(dòng)條,可以直接使用的滾動(dòng)條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • js將控件隱藏及display屬性的使用介紹

    js將控件隱藏及display屬性的使用介紹

    用JavaScript隱藏控件的方法有兩種,分別是通過設(shè)置控件的style的“display”和“visibility”屬性,下面詳細(xì)為大家介紹下具體的使用
    2013-12-12
  • es7學(xué)習(xí)教程之Decorators(修飾器)詳解

    es7學(xué)習(xí)教程之Decorators(修飾器)詳解

    這篇文章主要給大家介紹了關(guān)于es7中Decorators(修飾器)的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • JavaScript進(jìn)階練習(xí)及簡(jiǎn)單實(shí)例分析

    JavaScript進(jìn)階練習(xí)及簡(jiǎn)單實(shí)例分析

    下面小編就為大家?guī)硪黄狫avaScript進(jìn)階練習(xí)及簡(jiǎn)單實(shí)例分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • JavaScript自動(dòng)內(nèi)存管理與垃圾回收策略詳細(xì)分析講解

    JavaScript自動(dòng)內(nèi)存管理與垃圾回收策略詳細(xì)分析講解

    JS的垃圾回收機(jī)制是為了以防內(nèi)存泄漏,內(nèi)存泄漏的含義就是當(dāng)已經(jīng)不需要某塊內(nèi)存時(shí)這塊內(nèi)存還存在著,垃圾回收機(jī)制就是間歇的不定期的尋找到不再使用的變量,并釋放掉它們所指向的內(nèi)存。因?yàn)閮?nèi)存的大小是有限的,所以當(dāng)內(nèi)存不再需要的時(shí)候,我們需要對(duì)其進(jìn)行釋放
    2023-01-01
  • 在TypeScript項(xiàng)目中進(jìn)行BDD測(cè)試

    在TypeScript項(xiàng)目中進(jìn)行BDD測(cè)試

    這篇文章主要介紹了在TypeScript項(xiàng)目中進(jìn)行BDD測(cè)試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • javascript 去字符串空格終極版(支持utf8)

    javascript 去字符串空格終極版(支持utf8)

    其實(shí)空格有兩個(gè),一個(gè)ASCII編號(hào)是32,另一個(gè)是ASCII編號(hào)是160.后者是unicode編碼。以前寫一個(gè)貼子ie6下準(zhǔn)確判斷空格還以是IE6不能正確判斷空格。
    2009-11-11
  • javascript判斷chrome瀏覽器的方法

    javascript判斷chrome瀏覽器的方法

    這篇文章主要介紹了javascript判斷chrome瀏覽器的方法,通過userAgent判斷檢測(cè)一下userAgent返回的字符串里面是否包含“Chrome”,需要的朋友可以參考下
    2014-03-03
  • Web網(wǎng)站都變成灰色有哪些方法可以快速實(shí)現(xiàn)(解決方案)

    Web網(wǎng)站都變成灰色有哪些方法可以快速實(shí)現(xiàn)(解決方案)

    有些時(shí)候我們需要把網(wǎng)站頁面變成黑白色或灰色,特別是對(duì)于一些需要悼念的日子,以及一些影響力很大的偉人逝世或紀(jì)念日的時(shí)候,都會(huì)讓網(wǎng)站的全部網(wǎng)頁變成灰色(黑白色),以表示我們對(duì)逝者或者英雄的緬懷和悼念
    2022-12-12

最新評(píng)論