函數(shù)3

1.回調(diào)
函數(shù)讓不連續(xù)的事件處理變得容易起來
下面我們來看一個同步的傳統(tǒng)的例子

var request = prepare_request();    // 請求預(yù)處理
var response = send_request_sync(request);  // 發(fā)送請求到客戶端
display(response);      // 處理服務(wù)器響應(yīng)

上述的例子是同步發(fā)送的鸣个,如果服務(wù)器響應(yīng)過慢宦棺,那么會出現(xiàn)客戶端假死的現(xiàn)象
因此我們需要使用異步的方式,完成客戶端與服務(wù)器端的交互

var request = prepare_request();    // 請求預(yù)處理
send_request_asyc(request, function (response) {
    display(response);
});
// 我們傳遞函數(shù)作為參數(shù)發(fā)送給send_request_asyc萌狂,當(dāng)服務(wù)器響應(yīng)后進行處理

2.模塊
模塊是一個提供了接口但是隱藏了狀態(tài)與實現(xiàn)函數(shù)的函數(shù)或者對象
我們可以用函數(shù)和閉包來構(gòu)成模塊
模塊可以使我們完全摒棄全局變量的作用
下面我們來看一個有關(guān)與解析實體字符為html標(biāo)簽的例子

Function.prototype.method = function (name, fun) {
    // 如果添加的方法不存在,才可以添加
    if(!this.prototype[name]) {
        this.prototype[name] = fun;
        return this;
    }
}
String.method("deentityify", function () {
    // 私有屬性對象
    var entity = {
        quot : '"',
        lt : "<", 
        gt : ">"
    }
    // 創(chuàng)建可以返回且可以訪問entity私有變量的特權(quán)方法
    return function () {
        // 匹配以&開始穿扳,以;結(jié)束,且中間的字符不能為&或者;開頭的字符
        // this代表調(diào)用此函數(shù)的字符串
        return this.replace(/&([^&;]+);/g, function (a,  b) {
            var r = entity[b];
            // alert(a);    // &lt; &quot; &gt; &ddd;
            // alert(alert(b));// lt undefined quot undefined gt undefined ddd
            return typeof r === "string" ? r : a;
        });
    }
}());
document.writeln("&lt;&quot;&gt;&ddd;".deentityify());  // <">&ddd; 

模塊的一般形式:
一個定義了私有變量或者函數(shù)的函數(shù)国旷,
利用閉包創(chuàng)建可以訪問到私有變量或者函數(shù)的特權(quán)方法矛物,
最后返回這個特權(quán)方法,或者將其存放到一個可以訪問的地方跪但。
接下來我們要構(gòu)建一個可以生成序列化的模塊

var serial_maker = function () {
    // 定義兩個私有的變量履羞,前綴和序列號
    var prex = '';
    var seq = 0;
    // 返回一個可以訪問私有變量的對象
    return {
        setPrex : function (p) {
            prex = String(p);
        },
        setSeq : function (s) {
            seq = Number(s);
        },
        gensyn : function () {
            var result = prex + seq;
            seq++;
            return result;
        }
    };
};
var maker = serial_maker();
maker.setPrex("U");
maker.setSeq(200);
alert(maker.gensyn());  // U200
maker.setPrex("Q");
alert(maker.gensyn());  // Q200

3.級聯(lián)
一些方法,例如修改和設(shè)置屡久,沒有返回值忆首,默認為undefined,
我們可以讓他們返回this被环,這樣這個方法就開啟了級聯(lián)糙及,即可以依次調(diào)用同一個對象的許多方法

getElement("div").move(200, 200).setBackground("#ccc").....;    //這個div可以一次性完成許多工作

4.套用
套用允許我們將函數(shù)與傳遞給它的參數(shù)結(jié)合產(chǎn)生新函數(shù)

var add = function (a, b) {
    return a + b;
}
Function.method("curry", function () {
    var slice = Array.prototype.slice;
    // 取得外部參數(shù),即下面實例的10
    var args = slice.apply(arguments);
    alert(args);    // 10
    var that = this;
    alert(this);    // 調(diào)用curry的函數(shù)筛欢,即a下面實例的add()方法
    return function () {
        alert(this);    // [object Window]
        return that.apply(null, args.concat(slice.apply(arguments)));
    }
});
var add1 = add.curry(10);
alert(add1(100));   // 110

5.記憶
函數(shù)可以讓對象記住先前操作的結(jié)果浸锨,這樣就避免了無謂的計算
下面來看一個例子

var fibonacci = function (n) {
    return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2);
}
var start = Date.now();
for(var i = 0; i <= 30; i++) {
    if (i == 30) {
        document.writeln("http:// " + i + " : " + fibonacci(i) + "<br/>");
    }
}
var end = Date.now();
document.writeln("原始使用時間: " + (end - start) + "<br/>"); // 用時1360

據(jù)統(tǒng)計,fibonacci函數(shù)被調(diào)用了453次版姑,我們調(diào)用了11次柱搜,
而自身調(diào)用了442次自身去計算之前計算過的值
因此我們可以用記憶的方式,來優(yōu)化一下程序

var fibonacciMemory = function () {
    var meo = [0, 1];
    var fib = function (n) {
        var result = meo[n];
        if(typeof result !== 'number') {
            result = arguments.callee(n - 1) + arguments.callee(n - 2);
            meo[n] = result;
        }
        return result;
    }
    return fib;
}();
var start = Date.now();
for(var i = 0; i <= 400; i++) {
    if (i == 400) {
        document.writeln("http:// " + i + " : " + fibonacciMemory(i) + "<br/>");
    }
}
var end = Date.now();
document.writeln("記憶優(yōu)化時間: " + (end - start));

當(dāng)然漠酿,我們可以將記憶這種形式一般化

var memoizer = function (memo, fundamental) {
    var shell = function (n) {
        var result = memo[n];
        if (typeof result !== 'number') {
            result = fundamental(shell, n);
            memo[n] = result;
        }
        return result;
    }
    return shell;
};
var fibonacci = memoizer([0, 1], function (shell, n) {
    return shell(n - 1) + shell(n - 2);
});
alert(fibonacci(10));       // 55
alert(fibonacci(100));      // 354224848179262000000
var factorial = memoizer([1, 1], function (shell, n) {
    return shell(n - 1) * n;
});
alert(factorial(5));    // 120
alert(factorial(50));   // 3.0414093201713376e+64
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冯凹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炒嘲,更是在濱河造成了極大的恐慌宇姚,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夫凸,死亡現(xiàn)場離奇詭異浑劳,居然都是意外死亡,警方通過查閱死者的電腦和手機夭拌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門魔熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸽扁,你說我怎么就攤上這事蒜绽。” “怎么了桶现?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵躲雅,是天一觀的道長。 經(jīng)常有香客問我骡和,道長相赁,這世上最難降的妖魔是什么相寇? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮钮科,結(jié)果婚禮上唤衫,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布丈氓。 她就那樣靜靜地躺著,像睡著了一般植兰。 火紅的嫁衣襯著肌膚如雪份帐。 梳的紋絲不亂的頭發(fā)上璃吧,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音废境,去河邊找鬼畜挨。 笑死,一個胖子當(dāng)著我的面吹牛噩凹,可吹牛的內(nèi)容都是我干的巴元。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼驮宴,長吁一口氣:“原來是場噩夢啊……” “哼逮刨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堵泽,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤修己,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迎罗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睬愤,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年纹安,在試婚紗的時候發(fā)現(xiàn)自己被綠了尤辱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡厢岂,死狀恐怖光督,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塔粒,我是刑警寧澤结借,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站窗怒,受9級特大地震影響映跟,放射性物質(zhì)發(fā)生泄漏蓄拣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一努隙、第九天 我趴在偏房一處隱蔽的房頂上張望球恤。 院中可真熱鬧,春花似錦荸镊、人聲如沸咽斧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽张惹。三九已至,卻和暖如春岭洲,著一層夾襖步出監(jiān)牢的瞬間宛逗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工盾剩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷激,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓告私,卻偏偏與公主長得像屎暇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子驻粟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法根悼,類相關(guān)的語法,內(nèi)部類的語法蜀撑,繼承相關(guān)的語法挤巡,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 一只蟲子扯開絲線 飛入另一片織網(wǎng) 明明滅滅的火焰下 燃燒著它的翅膀 微弱的吶喊被浮塵遮蓋 落入塵土中 一只大腳踩下
    彧愔從閱讀 123評論 0 0
  • 高三時大學(xué)是一個奮斗的夢想它在夢想里我在夢想外--------------------大一時大學(xué)是一個游樂園它在不...
    wanna_dance閱讀 148評論 0 1
  • 生平第一次走出國境屯掖,感受之深至今仍歷歷在目玄柏。匯總在一起,以為留念贴铜。 臺灣初印象(第五日至第六日) 臺灣初印象(第七...
    Crystal冰閱讀 132評論 0 0