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

首頁 > 編程 > JavaScript > 正文

深入理解JavaScript系列(50):Function模式(下篇)

2019-11-20 13:01:10
字體:
來源:轉載
供稿:網友

介紹

本篇我們介紹的一些模式稱為初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已經提到過,這里只是做一下總結。

立即執行的函數

在本系列第4篇的《立即調用的函數表達式》中,我們已經對類似的函數進行過詳細的描述,這里我們只是再舉兩個簡單的例子做一下總結。

復制代碼 代碼如下:

// 聲明完函數以后,立即執行該函數
(function () {
    console.log('watch out!');
} ());

//這種方式聲明的函數,也可以立即執行
!function () {
    console.log('watch out!');
} ();

// 如下方式也都可以哦
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();


立即執行的對象初始化

該模式的意思是指在聲明一個對象(而非函數)的時候,立即執行對象里的某一個方法來進行初始化工作,通常該模式可以用在一次性執行的代碼上。

復制代碼 代碼如下:

({
    // 這里你可以定義常量,設置其它值
    maxwidth: 600,
    maxheight: 400,

    //  當然也可以定義utility方法
    gimmeMax: function () {
        return this.maxwidth + "x" + this.maxheight;
    },

    // 初始化
    init: function () {
        console.log(this.gimmeMax());
        // 更多代碼...
    }
}).init();  // 這樣就開始初始化咯

分支初始化

分支初始化是指在初始化的時候,根據不同的條件(場景)初始化不同的代碼,也就是所謂的條件語句賦值。之前我們在做事件處理的時候,通常使用類似下面的代碼:

復制代碼 代碼如下:

var utils = {
    addListener: function (el, type, fn) {
        if (typeof window.addEventListener === 'function') {
            el.addEventListener(type, fn, false);
        } else if (typeof document.attachEvent !== 'undefined') {
            el.attachEvent('on' + type, fn);
        } else {
            el['on' + type] = fn;
        }
    },
    removeListener: function (el, type, fn) {
    }
};

我們來改進一下,首先我們要定義兩個接口,一個用來add事件句柄,一個用來remove事件句柄,代碼如下:

復制代碼 代碼如下:

var utils = {
    addListener: null,
    removeListener: null
};

實現代碼如下:
復制代碼 代碼如下:

if (typeof window.addEventListener === 'function') {
    utils.addListener = function (el, type, fn) {
        el.addEventListener(type, fn, false);
    };
} else if (typeof document.attachEvent !== 'undefined') { // IE
    utils.addListener = function (el, type, fn) {
        el.attachEvent('on' + type, fn);
    };
    utils.removeListener = function (el, type, fn) {
        el.detachEvent('on' + type, fn);
    };
} else { // 其它舊瀏覽器
    utils.addListener = function (el, type, fn) {
        el['on' + type] = fn;
    };
    utils.removeListener = function (el, type, fn) {
        el['on' + type] = null;
    };
}

用起來,是不是就很方便了?代碼也優雅多了。

自聲明函數

一般是在函數內部,重寫同名函數代碼,比如:

復制代碼 代碼如下:

var scareMe = function () {
    alert("Boo!");
    scareMe = function () {
        alert("Double boo!");
    };
};

這種代碼,非常容易使人迷惑,我們先來看看例子的執行結果:
復制代碼 代碼如下:

// 1. 添加新屬性
scareMe.property = "properly";
// 2. scareMe賦與一個新值
var prank = scareMe;
// 3. 作為一個方法調用
var spooky = {
    boo: scareMe
};
// 使用新變量名稱進行調用
prank(); // "Boo!"
prank(); // "Boo!"
console.log(prank.property); // "properly"
// 使用方法進行調用
spooky.boo(); // "Boo!"
spooky.boo(); // "Boo!"
console.log(spooky.boo.property); // "properly"

通過執行結果,可以發現,將定于的函數賦值與新變量(或內部方法),代碼并不執行重載的scareMe代碼,而如下例子則正好相反:
復制代碼 代碼如下:

// 使用自聲明函數
scareMe(); // Double boo!
scareMe(); // Double boo!
console.log(scareMe.property); // undefined

大家使用這種模式時,一定要非常小心才行,否則實際結果很可能和你期望的結果不一樣,當然你也可以利用這個特殊做一些特殊的操作。

內存優化

該模式主要是利用函數的屬性特性來避免大量的重復計算。通常代碼形式如下:

復制代碼 代碼如下:

var myFunc = function (param) {
    if (!myFunc.cache[param]) {
        var result = {};
        // ... 復雜操作 ...
        myFunc.cache[param] = result;
    }
    return myFunc.cache[param];
};

// cache 存儲
myFunc.cache = {};


但是上述代碼有個問題,如果傳入的參數是toString或者其它類似Object擁有的一些公用方法的話,就會出現問題,這時候就需要使用傳說中的hasOwnProperty方法了,代碼如下:
復制代碼 代碼如下:

var myFunc = function (param) {
    if (!myFunc.cache.hasOwnProperty(param)) {
        var result = {};
        // ... 復雜操作 ...
        myFunc.cache[param] = result;
    }
    return myFunc.cache[param];
};

// cache 存儲
myFunc.cache = {};


或者如果你傳入的參數是多個的話,可以將這些參數通過JSON的stringify方法生產一個cachekey值進行存儲,代碼如下:
復制代碼 代碼如下:

var myFunc = function () {
    var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)),
        result;
    if (!myFunc.cache[cachekey]) {
        result = {};
        // ... 復雜操作 ...
        myFunc.cache[cachekey] = result;
    }
    return myFunc.cache[cachekey];
};

// cache 存儲
myFunc.cache = {};


或者多個參數的話,也可以利用arguments.callee特性:
復制代碼 代碼如下:

var myFunc = function (param) {
    var f = arguments.callee,
        result;
    if (!f.cache[param]) {
        result = {};
        // ... 復雜操作 ...
        f.cache[param] = result;
    }
    return f.cache[param];
};

// cache 存儲
myFunc.cache = {};

總結

就不用總結了吧,大家仔細看代碼就行咯

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩中文字幕在线| 91精品国产91久久久久久| 欧美裸体视频网站| 黄色一区二区在线观看| 久久影视电视剧免费网站清宫辞电视| 久久在精品线影院精品国产| 亚洲系列中文字幕| 色综合伊人色综合网| 成人免费高清完整版在线观看| 亚洲欧洲成视频免费观看| 亚洲国产高清高潮精品美女| 欧美日韩亚洲一区二区三区| 国产在线视频不卡| 91精品在线影院| 久久99视频精品| 中文字幕日韩精品在线| 成人国产精品一区二区| 亚洲精品国偷自产在线99热| 91久久久久久久久| 亚洲色图狂野欧美| 欧洲美女7788成人免费视频| 欧美一级高清免费| 欧美在线影院在线视频| 国产91精品在线播放| 亚洲free性xxxx护士hd| 日韩欧美高清在线视频| 91免费看国产| 日韩av在线免费看| 中文字幕v亚洲ⅴv天堂| 国产成人自拍视频在线观看| 精品偷拍一区二区三区在线看| 亚洲成人av资源网| 国产精品情侣自拍| 国产亚洲综合久久| 97av在线视频免费播放| 国产成人精品视频在线| 久久久久久久久爱| 日韩第一页在线| 欧美肥臀大乳一区二区免费视频| 97成人精品区在线播放| 久久久久久国产精品美女| 日韩久久午夜影院| 在线观看国产成人av片| 136fldh精品导航福利| 91精品国产精品| 日本精品久久电影| 日韩av免费看网站| 久久久精品久久久久| 亚洲人成欧美中文字幕| 亚洲高清久久久久久| 日韩大胆人体377p| 国产成人一区二区三区小说| 精品久久久久久久久久久久久| 国产日韩在线免费| 91久久精品久久国产性色也91| 欧美中文字幕在线视频| 69久久夜色精品国产69乱青草| 亚洲视频专区在线| 一区二区在线视频播放| 不卡av在线播放| 日韩经典一区二区三区| 亚洲免费电影在线观看| 欧美日韩国产色视频| 俺去亚洲欧洲欧美日韩| 亚洲www永久成人夜色| 国产suv精品一区二区| 日本久久中文字幕| 高跟丝袜一区二区三区| 国产男人精品视频| 日本成人黄色片| 91九色国产视频| 日韩在线欧美在线国产在线| 国产丝袜一区二区三区免费视频| 欧美日韩在线视频一区二区| 亚洲成人精品视频| 69国产精品成人在线播放| 国产日韩欧美在线视频观看| 欧美大学生性色视频| 中文字幕亚洲专区| 国产精品久久77777| 日韩最新在线视频| 国产精品天天狠天天看| 色青青草原桃花久久综合| 91亚洲精品久久久久久久久久久久| 久久人人爽国产| 国产亚洲精品高潮| 伊人av综合网| 国产精品成人av性教育| 久久综合电影一区| www.久久久久久.com| 欧美精品第一页在线播放| 最近2019中文字幕大全第二页| 中文国产成人精品| 欧美中文字幕在线播放| 国产精品一久久香蕉国产线看观看| 日本精品一区二区三区在线播放视频| 亚洲aaaaaa| 欧美日韩免费在线观看| 国内精品小视频| 国产一区二区丝袜| 欧美在线观看网址综合| 日韩电影免费在线观看| 成人精品在线观看| 亚洲网站视频福利| 色黄久久久久久| 少妇av一区二区三区| 乱亲女秽乱长久久久| 国产精品欧美亚洲777777| 亚洲午夜色婷婷在线| 欧美性猛交xxxx富婆| 国内精品久久久久久久久| 亚洲在线观看视频| 精品成人av一区| 97国产精品免费视频| 欧美激情第1页| 国产精品视频一| 精品日韩视频在线观看| 黄色成人av在线| 亚洲经典中文字幕| 国产成人精品亚洲精品| 日韩美女在线播放| 亚洲va欧美va在线观看| 日韩av综合网站| 国产精品电影久久久久电影网| 欧洲精品毛片网站| 欧美亚洲午夜视频在线观看| 国产69精品久久久久久| 欧美高清一级大片| 欧美精品久久久久a| 51久久精品夜色国产麻豆| 欧美一级视频在线观看| 青青久久aⅴ北条麻妃| 欧美日韩在线另类| 国产91精品黑色丝袜高跟鞋| 91在线观看免费| 91综合免费在线| 欧美日韩一区二区在线播放| 色综合色综合网色综合| 人人爽久久涩噜噜噜网站| 成人激情免费在线| 日韩欧美在线字幕| 亚洲一区二区三区香蕉| 国产欧美久久一区二区| 色狠狠av一区二区三区香蕉蜜桃| 不卡av电影院| 欧美成人午夜激情视频| 国产精品91在线观看| 久久久国产精品亚洲一区| 日韩av综合中文字幕| 色偷偷9999www| 欧美一级大片在线免费观看| 色综久久综合桃花网| 国产精品无码专区在线观看| 欧美日韩美女在线观看| 色偷偷亚洲男人天堂| 日本高清视频一区| 中文字幕日韩欧美在线视频| 国产精品99久久久久久久久久久久| 国产一区二区在线免费| 日韩中文字幕av| 亚洲片在线观看| 欧美日韩精品在线视频| 日本精品中文字幕| 久久九九热免费视频|