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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:16:04
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了深入理解JavaScript系列(50):Function模式(下篇),本篇我們介紹的一些模式稱為初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已經提到過,這里只是做一下總結,需要的朋友可以參考下
 

介紹

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

立即執行的函數

在本系列第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| 亚洲最大福利视频| 亚洲精品资源在线| 欧美国产一区二区三区| 欧美日韩国产成人在线| 精品国产一区二区三区久久狼5月| 热久久美女精品天天吊色| 日韩有码片在线观看| 亚洲精品自产拍| 国产欧美久久久久久| 91sa在线看| 欧美乱大交xxxxx| 国产精品久久久久77777| 国产日产久久高清欧美一区| 国产欧美日韩精品在线观看| 亚洲美女精品久久| xxxx欧美18另类的高清| 奇米四色中文综合久久| 亚洲无亚洲人成网站77777| 狠狠做深爱婷婷久久综合一区| 欧美一级视频免费在线观看| 国产欧美一区二区三区久久| 成人妇女淫片aaaa视频| 2018中文字幕一区二区三区| 国产成人avxxxxx在线看| 久久国产一区二区三区| 国产精品久久久久久中文字| 亚洲国产天堂久久国产91| 国产精品一区二区女厕厕| 91午夜在线播放| 久久精品欧美视频| 国产精品一区二区三区久久久| 国产精品网红直播| 欧美性高潮床叫视频| 欧美黄色性视频| xxx一区二区| 欧美国产日本高清在线| 亚洲天堂网在线观看| 久久久亚洲影院你懂的| 亚洲一区二区在线| 欧美激情精品久久久久久免费印度| 国产成人精品国内自产拍免费看| 最新国产成人av网站网址麻豆| 国产一区二区三区网站| 九九久久久久99精品| 国产91对白在线播放| 久久91精品国产| 人人做人人澡人人爽欧美| 成人免费视频在线观看超级碰| 一区二区欧美亚洲| 欧美成人高清视频| 欧美国产日韩免费| 亚洲娇小xxxx欧美娇小| 国产精品对白刺激| 日韩免费av在线| 欧美激情视频在线免费观看 欧美视频免费一| 色99之美女主播在线视频| 国产精品旅馆在线| 久久久亚洲成人| 欧美在线观看视频| 动漫精品一区二区| 日韩福利伦理影院免费| 欧美高清不卡在线| 国产视频一区在线| 午夜精品一区二区三区在线播放| 亚洲影院色在线观看免费| 亚洲免费人成在线视频观看| 这里只有精品久久| 日韩精品在线观看一区二区| 久久久久日韩精品久久久男男| 欧美亚洲成人xxx| 九九热最新视频//这里只有精品| 亚洲图中文字幕| 欧美在线日韩在线| 91av视频导航| 亚洲香蕉av在线一区二区三区| 欧美黑人性猛交| 日韩中文字幕在线观看| 国产精品精品视频一区二区三区| 国产成人黄色av| 色樱桃影院亚洲精品影院| 成人激情视频在线观看| 色妞欧美日韩在线| 久久av在线播放| 国产午夜精品视频免费不卡69堂| 欧美日韩美女在线| 日韩在线中文字| 亚洲色图第一页| 欧美最猛性xxxxx亚洲精品| 在线看欧美日韩| 97av在线播放| 国产欧美一区二区三区在线看| 亚洲无亚洲人成网站77777| 亚洲欧美精品在线| 在线中文字幕日韩| 欧美专区中文字幕| 91久久精品在线| 久久精品亚洲热| 亚洲国产三级网| 亚洲一区二区免费在线| 亚洲成人1234| 欧美国产日韩xxxxx| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲女人天堂视频| 国产精品久久久av久久久| 日韩欧美aaa| 国产精品r级在线| 欧美黑人性生活视频| 久久久综合av| 欧美性做爰毛片| 久久99青青精品免费观看| 国产精品国产福利国产秒拍| 亚洲第一国产精品| 国产精品专区h在线观看| 亚洲高清免费观看高清完整版| 国产精品亚洲美女av网站| 91中文字幕在线| 日韩高清电影免费观看完整| 欧美电影在线观看高清| 色综久久综合桃花网| 久久九九国产精品怡红院| 在线精品国产欧美| 69久久夜色精品国产69乱青草| 狠狠色香婷婷久久亚洲精品| 成人精品久久久| 91精品美女在线| 热门国产精品亚洲第一区在线| 国产精品视频久| 欧美精品videosex极品1| 国产午夜精品视频免费不卡69堂| 91精品在线影院| 国产区精品在线观看| 欧美日韩国产二区| 亚洲国产精彩中文乱码av在线播放| 日韩欧美精品网址| 欧美xxxx做受欧美| 欧美在线欧美在线| 亚洲日韩欧美视频| 欧美日韩午夜视频在线观看| 欧美日韩另类字幕中文| 午夜精品免费视频| 成人www视频在线观看| 青草成人免费视频| 亚洲精品福利在线| 精品久久久免费| 国产成人精品久久| 亚洲乱码国产乱码精品精天堂| 4438全国亚洲精品在线观看视频| 亚洲精品免费在线视频| 精品中文字幕久久久久久| 亚洲成**性毛茸茸| 亚洲精品有码在线| 国产精品久久在线观看| 亚洲天堂男人的天堂| 亚洲国产成人一区| 亚洲美女激情视频| 亚洲国产一区二区三区在线观看| 日本欧美精品在线| 亚洲欧美精品在线| 欧美激情综合色综合啪啪五月| 亚洲精品视频在线观看视频| 日本不卡视频在线播放| 欧美成年人网站|