最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年03月04日 11:05:57   投稿:junjie  
這篇文章主要介紹了深入理解JavaScript系列(50):Function模式(下篇),本篇我們介紹的一些模式稱為初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已經(jīng)提到過,這里只是做一下總結,需要的朋友可以參考下

介紹

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

立即執(zhí)行的函數(shù)

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

復制代碼 代碼如下:

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

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

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


立即執(zhí)行的對象初始化

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

復制代碼 代碼如下:

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

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

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

分支初始化

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

復制代碼 代碼如下:

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

實現(xiàn)代碼如下:
復制代碼 代碼如下:

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

用起來,是不是就很方便了?代碼也優(yōu)雅多了。

自聲明函數(shù)

一般是在函數(shù)內(nèi)部,重寫同名函數(shù)代碼,比如:

復制代碼 代碼如下:

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

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

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

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

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

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

內(nèi)存優(yōu)化

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

復制代碼 代碼如下:

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

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


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

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

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


或者如果你傳入的參數(shù)是多個的話,可以將這些參數(shù)通過JSON的stringify方法生產(chǎn)一個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 = {};


或者多個參數(shù)的話,也可以利用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 = {};

總結

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

相關文章

  • 盡可能寫"友好"的"Javascript"代碼

    盡可能寫"友好"的"Javascript"代碼

    盡可能寫"友好"的"Javascript"代碼...
    2007-01-01
  • JavaScript 學習筆記(九)call和apply方法

    JavaScript 學習筆記(九)call和apply方法

    兩者實現(xiàn)的功能是完全一樣的,只是參數(shù)傳遞方式不一樣,call是將各個參數(shù)以逗號(,)隔開,而apply是將所有參數(shù)組成一個數(shù)組進行傳遞。
    2010-01-01
  • javascript數(shù)據(jù)代理與事件詳解分析

    javascript數(shù)據(jù)代理與事件詳解分析

    所謂數(shù)據(jù)代理(也叫數(shù)據(jù)劫持),指的是在訪問或者修改對象的某個屬性時,通過一段代碼攔截這個行為,進行額外的操作或者修改返回結果。比較典型的是 Object.defineProperty() 和 ES2015 中新增的 Proxy 對象
    2021-11-11
  • JS的Document屬性和方法小結

    JS的Document屬性和方法小結

    Document想必大家并不陌生吧,在使用js的過程中會經(jīng)常遇到它,那么它有哪些屬性、哪些方法,在本文將以示例為大家詳細介紹下,希望對大家有所幫助
    2013-09-09
  • element?$notify?懸浮通知使用詳解

    element?$notify?懸浮通知使用詳解

    這篇文章主要介紹了element?$notify?懸浮通知使用詳解,主要講解如何使用this.$notify做一個懸浮通知,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2020-06-06
  • js自帶函數(shù)備忘 數(shù)組

    js自帶函數(shù)備忘 數(shù)組

    js自帶函數(shù)備忘 數(shù)組...
    2006-12-12
  • 老生常談javascript變量的命名規(guī)范和注釋

    老生常談javascript變量的命名規(guī)范和注釋

    下面小編就為大家?guī)硪黄仙U刯avascript變量的命名規(guī)范和注釋。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Javascript基礎_嵌入圖像的簡單實現(xiàn)

    Javascript基礎_嵌入圖像的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄狫avascript 基礎_嵌入圖像的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • JavaScript sub方法入門實例(把字符串顯示為下標)

    JavaScript sub方法入門實例(把字符串顯示為下標)

    這篇文章主要介紹了JavaScript sub方法入門實例,sub方法用于把字符串顯示為下標,需要的朋友可以參考下
    2014-10-10
  • 全選復選框JavaScript編寫小結(附代碼)

    全選復選框JavaScript編寫小結(附代碼)

    這篇文章主要介紹了全選”復選框JavaScript編寫,分別附上html和js代碼以供大家更深刻了解,具體操作步驟大家可查看下文的詳細講解,感興趣的小伙伴們可以參考一下。
    2017-08-08

最新評論

平武县| 大新县| 桑植县| 泸西县| 平舆县| 西乌珠穆沁旗| 朝阳县| 和平区| 青龙| 宁明县| 泉州市| 称多县| 仙桃市| 定兴县| 岳池县| 太仆寺旗| 高邮市| 平安县| 乐昌市| 静海县| 广水市| 旬阳县| 巴彦县| 碌曲县| 西华县| 横山县| 商都县| 井冈山市| 阿勒泰市| 彭州市| 河间市| 鄄城县| 张家界市| 体育| 上杭县| 江口县| 南宫市| 鸡东县| 南安市| 渑池县| 阳新县|