JavaScript學(xué)習(xí)總結(jié)之Function類型

Function類型

每個(gè)函數(shù)都是Function類型的實(shí)例,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針

一伺绽、函數(shù)的定義方法

1、函數(shù)聲明

function sum(num1,num2) {
   return num1 + num2;
}

2澜掩、函數(shù)表達(dá)式定義

var sum = function(num1,num2) {
  return num1 + num2;
};

3杖挣、使用Function構(gòu)造函數(shù)(不推薦使用)

二、函數(shù)沒有重載(深入理解)
function addSomeNumber(num) {
  return num + 100;
}
function addSomeNumber(num) {
  return num + 200;
}
var result = addSomeNumber(100); //300

后面的函數(shù)會(huì)覆蓋了前面的函數(shù)株汉,因?yàn)閷⒑瘮?shù)名想象為指針乔妈,相當(dāng)于指針指向了新的函數(shù)對(duì)象氓皱;

三、函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別
alert(sum(10,10));
function sum(num1,num2) {
   return num1 + num2;
}

上面的代碼完全可以正常運(yùn)行股淡。因?yàn)樵诖a開始執(zhí)行之前廷区,解析器就已經(jīng)通過一個(gè)名為函數(shù)聲明提升的過程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中隙轻,相當(dāng)于解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用搞监。再看一下函數(shù)表達(dá)式的例子:

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

以上代碼會(huì)在運(yùn)行期間產(chǎn)生錯(cuò)誤镰矿,因?yàn)樵谟诤瘮?shù)位于一個(gè)初始化語句中俘种,而不是一個(gè)函數(shù)聲明。
除了什么時(shí)候可以通過變量訪問函數(shù)這一點(diǎn)區(qū)別之外苍姜,函數(shù)聲明與函數(shù)表達(dá)式的語法其實(shí)是等價(jià)的衙猪。

五、作為值得函數(shù)

因?yàn)楹瘮?shù)名本身就是變量垫释,所以函數(shù)也可以作為值來使用。請(qǐng)看下面的例子:

function createComparisonFunction(propertyName) {
     return function(object1,object2) {
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
        if(value1 < value2) {
             return -1;
        }
        if(value1 > value2) {
             return 1;
        } else {
             return 0;
        }
    };
}
六显蝌、函數(shù)內(nèi)部屬性

在函數(shù)內(nèi)部曼尊,有兩個(gè)特殊的對(duì)象:arguments和this脏嚷;

  • arguments:它是一個(gè)類數(shù)組對(duì)象,包含著傳入函數(shù)中的所有參數(shù)父叙;雖然arguments的主要用途是保存函數(shù)參數(shù)高每,但這個(gè)對(duì)象還有一個(gè)名為callee的屬性,該屬性是一個(gè)指針爷怀,指向擁有這個(gè)arguments對(duì)象的函數(shù)。請(qǐng)看下面非常經(jīng)典的階乘函數(shù):
function factoria(num) {
      if(num <= 1) {
           return 1;
      } else {
           return num * factoria(num - 1);
      }
}

由于這個(gè)函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在了一起运授,所以一旦函數(shù)名字改變了吁朦,結(jié)果就會(huì)改變渡贾,此時(shí)使用callee屬性能更好的解決這個(gè)問題。

function factoria(num) {
      if(num <= 1) {
           return 1;
      } else {
           return num * arguments.callee(num - 1);
      }
}
  • this對(duì)象:引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象纺讲,看看下面的例子:
window.color = "red";
var o = { color: "blue" };
function sayColor() {
    alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue"

把這個(gè)函數(shù)賦給對(duì)象o并調(diào)用o.sayColor()時(shí)囤屹,this引用的是對(duì)象o,因此對(duì)this.color求值會(huì)轉(zhuǎn)換成對(duì)o.color求值乡括;
一定要記住,函數(shù)的名字僅僅是一個(gè)包含指針的變量而已诲泌。因此,即使是在不同的環(huán)境中執(zhí)行角钩,全局的sayColor()函數(shù)與o.sayColor()指向的仍然是同一個(gè)函數(shù)呻澜。

  • ECMAScript5也規(guī)范化了另一個(gè)函數(shù)對(duì)象的屬性:caller。這個(gè)屬性中保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用脊髓,如果是在全局作用域中調(diào)用當(dāng)前函數(shù)将硝,它的值為null屏镊。
function outer() {
    inner();
}
function inner() {
    alert(arguments.callee.caller);
}
outer();

需要注意的是當(dāng)函數(shù)在嚴(yán)格模式下運(yùn)行,訪問arguments.callee會(huì)導(dǎo)致錯(cuò)誤的而芥,并且不能為函數(shù)的caller屬性賦值;

七误辑、函數(shù)屬性和方法
  • 函數(shù)的屬性:
    1歌逢、length:表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)。
    2砰苍、prototype:是保存所有實(shí)例方法的真實(shí)所在阱高。
  • 函數(shù)的方法:
    1、apply(在其中運(yùn)行函數(shù)的作用域,參數(shù)數(shù)組)
function sum(num1,num2) {
      return num1 + num2;
}
function callSum1(num1,num2) {
      return sum.apply(this,arguments);
}
function callSum2(num1,num2) {
      return sum.apply(this,[num1,num2]);
}

2寒屯、call(在其中運(yùn)行函數(shù)的作用域黍少,处面,,昵济,)
與apply()的區(qū)別在于其余參數(shù)都直接傳遞給函數(shù)野揪,而不是以數(shù)組的形式傳遞參數(shù);
實(shí)際上call()和apply()方法的真正強(qiáng)大之處在于能夠擴(kuò)充函數(shù)賴以運(yùn)行的作用域海铆。

window.color = "red";
var o = { color: "blue" };
function sayColor() {
    alert(this.color);
}
sayColor(); //"red"
sayColor.call(window);  //"red"
sayColor.call(this); //"red"
sayColor.call(o);// "blue"

3挣惰、bind():這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例憎茂,其this值會(huì)被綁定到傳給bind()函數(shù)的值。例如:

window.color = "red";
var o = { color: "blue" };
function sayColor() {
    alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //"blue"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末板乙,一起剝皮案震驚了整個(gè)濱河市亡驰,隨后出現(xiàn)的幾起案子饿幅,更是在濱河造成了極大的恐慌,老刑警劉巖透乾,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乳乌,死亡現(xiàn)場(chǎng)離奇詭異市咆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)磷瘤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門采缚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扳抽,你說我怎么就攤上這事×眨” “怎么了贮尉?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵猜谚,是天一觀的道長(zhǎng)魏铅。 經(jīng)常有香客問我昌犹,道長(zhǎng)斜姥,這世上最難降的妖魔是什么沧竟? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任杈笔,我火速辦了婚禮糕非,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朽肥。我一直安慰自己衡招,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布旱爆。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪房待。 梳的紋絲不亂的頭發(fā)上驼抹,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天框冀,我揣著相機(jī)與錄音明也,去河邊找鬼。 笑死温数,一個(gè)胖子當(dāng)著我的面吹牛绣硝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撑刺,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鹉胖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了够傍?” 一聲冷哼從身側(cè)響起甫菠,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冕屯,沒想到半個(gè)月后寂诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愕撰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年刹衫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搞挣。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搀继,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情财边,我是刑警寧澤酣难,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布袁辈,位于F島的核電站晚缩,受9級(jí)特大地震影響橡羞,放射性物質(zhì)發(fā)生泄漏莺债。R本人自食惡果不足惜齐邦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丐吓。 院中可真熱鬧券犁,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春膳音,著一層夾襖步出監(jiān)牢的瞬間苍凛,已是汗流浹背醇蝴。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭适,地道東北人癞志。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像戒突,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膝舅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 本文檔內(nèi)容參考 《JavaScript 闖關(guān)記》之函數(shù) 函數(shù)是一段代碼,它只定義一次遥巴,但可以被執(zhí)行或調(diào)用任意次。在...
    穿越人海遇見你閱讀 998評(píng)論 0 1
  • Chapter 5 引用類型 Object類型 創(chuàng)建Object實(shí)例new Object()var person ...
    云之外閱讀 391評(píng)論 0 0
  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語言携栋,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互婉支,擁有閉包向挖、匿名函數(shù)户誓, 甚至元編程等...
    LaBaby_閱讀 1,667評(píng)論 0 6
  • 一晤硕。不帶圓括號(hào)的函數(shù)名訪問的是函數(shù)指針舰褪,而非調(diào)用函數(shù) //不帶圓括號(hào)的函數(shù)名訪問的是函數(shù)指針占拍,而非調(diào)用函數(shù) fun...
    PomeloTerminal閱讀 320評(píng)論 0 3
  • 之前寫過函數(shù)也屬于引用類型,與其他引用類型一樣也是具有屬性和方法崔兴。由于函數(shù)是對(duì)象,繼承自object堰燎,因此函數(shù)名實(shí)...
    Miss____Du閱讀 5,766評(píng)論 4 17