《JavaScript高級程序設(shè)計》之函數(shù)類型

函數(shù)類型

1.函數(shù)也是對象书斜,并且函數(shù)名僅僅是指向函數(shù)的指針礼患。

var sum=function(num1,num2){
    return num1+num2;
}
console.info(sum(10,20));//30

var anothersum=sum;
console.info(anothersum(10,20));//30

sum=null;
console.info(anothersum(10,20));//30

2.函數(shù)沒有重載

3.函數(shù)聲明和函數(shù)表達式的區(qū)別

在js中函數(shù)聲明會在代碼解析器一開始將函數(shù)聲明體提升到頂部執(zhí)行屋厘,因此即便調(diào)用函數(shù)語句在函數(shù)聲明之前坏逢,也不會報錯高诺。

alert(sum(10,20));//不會出錯
function sum(num1,num2){
    return num1+num2;
}

而函數(shù)表達式在定義函數(shù)的時候踱讨,必須要等到代碼執(zhí)行到表達以后,才能調(diào)用此函數(shù)持偏。

alert(sum(10,20));//出錯
var sum=function(num1,num2){
    return num1+num2;
}

4.作為值的函數(shù)

在js中驼卖,可以像傳遞參數(shù)一樣,將一個函數(shù)傳遞給另一個函數(shù)鸿秆,也可以將一個函數(shù)當(dāng)作另一個函數(shù)的結(jié)果返回酌畜。如下

function callSomeFunction(someFunction,someArguments){
    return someFunction(someArguments);
}

var add10=function(num){
    return num+10;
}

alert(callSomeFunction(add10,10));//20

function greenting(name){
    return "Hello"+name;
}

alert(callSomeFunction(greenting,"tzw"));//"Hello tzw"

注意:因為函數(shù)變量是函數(shù)指針,因此在傳遞函數(shù)參數(shù)時卿叽,不需要寫圓括號桥胞。

另外,一個函數(shù)也可以當(dāng)作另一個函數(shù)的結(jié)果返回(典型的例子為創(chuàng)建一個比較函數(shù))考婴。例如如下:

    function createComparisonFunction(propertyName){
        return function(Oject1,Object2){
            var Value1=Object1[propertyName];
            var Value2=Object2[propertyName];
            
            if(Value1<Value2){
                return -1;//升序返回-1
            }else if(Value1>Value2){
                return 1;//降序返回1
            }else{
                return 0;
            }
        }
    }
  1. 函數(shù)的內(nèi)部屬性

函數(shù)內(nèi)部有兩個對象:arguments和this贩虾。arguments對象是用來保存函數(shù)參數(shù),并且這個對象有一個名叫callee的屬性沥阱,該屬性是一個指針缎罢,是來指向該擁有arguments對象的函數(shù)。利用階乘函數(shù)來看:

function factorial(num){
    if(num<=1){
        return 1;
    }else if(num>1){
        return num*arguments.callee(num-1);
    }
}

this是引用的是函數(shù)已執(zhí)行的環(huán)境對象,當(dāng)在網(wǎng)頁的全局作用域中調(diào)用函數(shù)的話策精,則是指windows對象舰始。

window.color="red";
var o={"color":"blue"};

function sayColor(){
  console.info(this.color);//red
}

o.sayColor=sayColor;
o.sayColor();//blue

還有一個特殊的屬性:caller。這個屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)引用咽袜。

function outer(){
    inner();
}

function inner(){
    console.info(inner.caller);
}

outer();

如果需要更加離散的耦合丸卷,則可以把inner替換成arguments.callee即可;

function outer(){
    inner();
}

function inner(){
    console.info(arguments.callee.caller);
}

outer();
  1. 函數(shù)的屬性和方法

函數(shù)也是對象酬蹋,所以函數(shù)也會包含屬性和方法及老。每個函數(shù)包含兩個屬性:length和prototype。length:指定義的函數(shù)所能接受的參數(shù)的個數(shù)范抓。每個函數(shù)也還有兩個非繼承而來的方法:apply()和call(),用來設(shè)置函數(shù)體內(nèi)this對象的值食铐。

apply()接受兩個參數(shù)匕垫,第一個為運行的函數(shù)的作用域,第二個參數(shù)為參數(shù)數(shù)組虐呻。

function sum(num1,num2){
        return num1+num2;
}
function callsum1(num1,num2){
        return sum.apply(this,arguments);//傳入arguments對象
}
function callsum2(num1,num2){
        return sum.apply(this,[num1,num2]);//傳入?yún)?shù)數(shù)組
}
alert(callsum1(10,10));//20
alert(callsum2(10,10));//20

call方法同樣也是有兩個參數(shù)象泵,第一個參數(shù)為this,運行函數(shù)的作用域斟叼,第二個參數(shù)就需要將所有參數(shù)逐一列出來偶惠。

function callsum3(num1,num2){
        return sum.call(this,num1,num2);//傳入?yún)?shù)
}
alert(callsum3(10,10));//20

實際上apply和call真正常用來擴充函數(shù)運行的作用域。

window.color="red";
var 0={"color":"blue"};

function sayColor(){
    alert(this.color);
}

sayColor();//red

sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue

用call和apply最大的好處在于對象與方法不需要有耦合關(guān)系朗涩,之前還需要將方法放入對象中忽孽,再調(diào)用。現(xiàn)在只需要用call和apply就可以了谢床。

另外兄一,還提供了一個bind()方法,這個方法會創(chuàng)建一個函數(shù)(方法)的實例识腿,他的this值會綁定到bind傳入的參數(shù)出革。

window.color="red";
var 0={"color":"blue"};

function sayColor(){
    alert(this.color);
}
var objectSayColor=sayColor.bind(o);//this值綁定了o對象
objectSayColor();//blue
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渡讼,隨后出現(xiàn)的幾起案子骂束,更是在濱河造成了極大的恐慌,老刑警劉巖成箫,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件展箱,死亡現(xiàn)場離奇詭異,居然都是意外死亡伟众,警方通過查閱死者的電腦和手機析藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人账胧,你說我怎么就攤上這事竞慢。” “怎么了治泥?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵筹煮,是天一觀的道長。 經(jīng)常有香客問我居夹,道長败潦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任准脂,我火速辦了婚禮劫扒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狸膏。我一直安慰自己沟饥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布湾戳。 她就那樣靜靜地躺著贤旷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砾脑。 梳的紋絲不亂的頭發(fā)上幼驶,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音韧衣,去河邊找鬼盅藻。 笑死,一個胖子當(dāng)著我的面吹牛汹族,可吹牛的內(nèi)容都是我干的萧求。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼顶瞒,長吁一口氣:“原來是場噩夢啊……” “哼夸政!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起榴徐,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤守问,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坑资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耗帕,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年袱贮,在試婚紗的時候發(fā)現(xiàn)自己被綠了仿便。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗽仪,靈堂內(nèi)的尸體忽然破棺而出荒勇,到底是詐尸還是另有隱情,我是刑警寧澤闻坚,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布沽翔,位于F島的核電站,受9級特大地震影響窿凤,放射性物質(zhì)發(fā)生泄漏仅偎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一雳殊、第九天 我趴在偏房一處隱蔽的房頂上張望橘沥。 院中可真熱鬧,春花似錦夯秃、人聲如沸威恼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腹备,卻和暖如春衬潦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背植酥。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工镀岛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人友驮。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓漂羊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卸留。 傳聞我的和親對象是個殘疾皇子走越,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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