q第4章 函數(shù)(Functions)

4.1 函數(shù)對象

  • 對象字面量產(chǎn)生的對象連接到object.prototype,函數(shù)對象連接到Function.prototype(該原型對象本身也連接到object.prototype)

4.3 調(diào)用 Invocation

  • 函數(shù)被調(diào)用時(shí)咖摹,接收兩個(gè)附加的參數(shù):thisarguments
  • 當(dāng)實(shí)際參數(shù)(arguments)與形式參數(shù)(parameters)的個(gè)數(shù)不匹配時(shí)不會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤蝙泼。
  • 實(shí)際參數(shù)過多疙渣,超出的參數(shù)值被忽略
  • 過少做粤,缺失的值被替換為undefined。
  • 對參數(shù)值不會(huì)進(jìn)行類型檢查:任何類型的值都可以傳遞
javascript的四種調(diào)用模式
  • 方法調(diào)用模式 The Method Invocation Pattern
    當(dāng)一個(gè)方法被調(diào)用時(shí)司抱,this被綁定到該對象永罚。
var myObject = {
    value:0,
    increment: function(inc){
        this.value += typeof inc === 'number'?inc:1;
    }
};
myObject.increment();
document.writeln(myObject.value);  //1
myObject.increment(2);
document.writeln(myObject.value);  //3

this到對象的綁定發(fā)生在調(diào)用的時(shí)候。
通過this可取得它們所屬對象的上下文的方法稱為公共方法宋舷。

  • 函數(shù)調(diào)用模式 The Function Invocation Pattern
    當(dāng)一個(gè)函數(shù)不是對象的屬性的時(shí)候,它被當(dāng)作函數(shù)來調(diào)用瓢姻。此時(shí)this綁定到全局對象祝蝠。
    這是個(gè)錯(cuò)誤的設(shè)計(jì),因?yàn)榉椒ㄔ谡{(diào)用內(nèi)部函數(shù)時(shí)幻碱,this本應(yīng)該綁定到外部函數(shù)的this绎狭,這使得方法不能利用內(nèi)部函數(shù)來幫助它工作,這里有個(gè)解決辦法:
myObject.double = function(){
    var that = this ;//解決方法

    var helper = function(){
        that.value = add(that.value,that.value);
    }
    helper();//函數(shù)調(diào)用模式
}
myObject.double();
document.writeln(myObject.value);//6
  • 構(gòu)造器調(diào)用模式 The Constructor Invocation Pattern
    Js是一門基于原型繼承的語言褥傍,但也提供了一套和基于類的語言相似的對象構(gòu)建方法儡嘶。
    如果在一個(gè)函數(shù)前面帶上new來調(diào)用,那么將創(chuàng)建一個(gè)隱藏連接到該函數(shù)的prototype成員的新對象恍风,同時(shí)this將會(huì)綁定到那個(gè)新對象上蹦狂。
var Quo = function (string){
    this.status = string;
};
Quo.prototype.get_status = function (){
    return this.status;
};
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());

約定構(gòu)造器函數(shù)要大寫!
順便不推薦這種方式朋贬,下一章有更好的替代方法凯楔。

  • Apply調(diào)用模式 The Apply Invocation Pattern
    apply方法接收兩個(gè)參數(shù),第一個(gè)綁定到this锦募,第二個(gè)是參數(shù)數(shù)組摆屯。
var array = [3,4];
var sum = add.apply(null,array);
document.writeln(sum);
var statusObject = {
    status : 'A-OK'
};
//雖然statusObject不繼承于 Quo.prototype,但依然可以調(diào)用get_status方法
var status = Quo.prototype.get_status.apply(statusObject);
document.write(status);

4.5 返回 Return

  • return語句可用來使函數(shù)提前返回糠亩。
  • 一個(gè)函數(shù)總是會(huì)返回一個(gè)值虐骑,如果沒有指定返回值,則返回undefined赎线。
  • 如果函數(shù)以在前面加上new前綴的方式來調(diào)用廷没,且返回值不是一個(gè)對象,則返回this(該新對象)

4.6 異常 Exceptions

JS提供了一套異常處理機(jī)制垂寥,throw語句中斷函數(shù)的執(zhí)行腕柜。它應(yīng)該拋出一個(gè)exception對象,該對象包含可識(shí)別異常類型的name屬性和一個(gè)描述性的message屬性矫废。也可以添加其他屬性。
該exception對象將被傳遞到一個(gè)try語句的catch從句

var add2 = function(a,b){
    if(typeof a !== 'number' || typeof b !== 'number'){
        throw {
            name: 'TypeError',
            message: 'add needs numbers'
        };
    }
    return a+b;
}
var try_it = function(){
    try {
        add2('seven');
    }catch(e){
        document.writeln(e.name+':'+e.message);
    }
}
try_it();

4.7 給類型增加方法 Augmenting Types

為什么這里是給Function增加方法而不是Object砰蠢?Number是在Function的原型鏈上的嗎蓖扑?
JS允許給語言的基本類型增加方法。

//定義新方法,這樣就不用總是輸入prototype了
Function.prototype.method = function(name, func) {
    if(!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
}

Number.method('integer', function() {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
})

4.10 閉包 Closure

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末台舱,一起剝皮案震驚了整個(gè)濱河市律杠,隨后出現(xiàn)的幾起案子潭流,更是在濱河造成了極大的恐慌,老刑警劉巖柜去,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灰嫉,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗓奢,警方通過查閱死者的電腦和手機(jī)讼撒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來股耽,“玉大人根盒,你說我怎么就攤上這事∥矧” “怎么了炎滞?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诬乞。 經(jīng)常有香客問我册赛,道長,這世上最難降的妖魔是什么震嫉? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任森瘪,我火速辦了婚禮,結(jié)果婚禮上责掏,老公的妹妹穿的比我還像新娘柜砾。我一直安慰自己,他們只是感情好换衬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布痰驱。 她就那樣靜靜地躺著,像睡著了一般瞳浦。 火紅的嫁衣襯著肌膚如雪担映。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天叫潦,我揣著相機(jī)與錄音蝇完,去河邊找鬼。 笑死矗蕊,一個(gè)胖子當(dāng)著我的面吹牛短蜕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傻咖,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朋魔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卿操?” 一聲冷哼從身側(cè)響起警检,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤孙援,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扇雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓售,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年镶奉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了础淤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腮鞍,死狀恐怖值骇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移国,我是刑警寧澤吱瘩,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站迹缀,受9級(jí)特大地震影響使碾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祝懂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一票摇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砚蓬,春花似錦矢门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摩梧,卻和暖如春物延,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仅父。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工叛薯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笙纤。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓耗溜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親省容。 傳聞我的和親對象是個(gè)殘疾皇子抖拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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