2019-12-20:第五章:引用類型(函數(shù))

5.function類型

函數(shù)實(shí)際上是一個(gè)對(duì)象弓千。因此函數(shù)名的本質(zhì)是一個(gè)指向函數(shù)對(duì)象的指針兵扬。

函數(shù)的對(duì)象定義法

他并不與某個(gè)函數(shù)綁定,這同時(shí)也就解釋了將某一個(gè)函數(shù)名多次定義乞巧,js只會(huì)調(diào)用最后一次定義的內(nèi)容涨椒。

另外,由于我們說函數(shù)名實(shí)際上是一個(gè)指向函數(shù)對(duì)象的指針绽媒,那么這也就意味著同一個(gè)函數(shù)可以有多個(gè)名字蚕冬。我們可以在定義一個(gè)函數(shù)后,定義另外一個(gè)變量 = 之前的指針是辕,這樣同一個(gè)函數(shù)就有兩個(gè)名字了囤热。因此,函數(shù)名只是指向函數(shù)對(duì)象的引用获三,這個(gè)定義非常重要旁蔼。要訪問函數(shù)指針,只需要訪問變量值石窑,而去掉括號(hào)即可牌芋。

5.1沒有重載(深入講解)

函數(shù)名是一個(gè)指針,他實(shí)際上并不與某個(gè)函數(shù)綁定松逊,這同時(shí)也就解釋了將某一個(gè)函數(shù)名多次定義躺屁,js只會(huì)調(diào)用最后一次定義的內(nèi)容。也就是沒有重載的原因经宏。

調(diào)用的是最后一次定義的a

5.2函數(shù)聲明和函數(shù)表達(dá)式

在運(yùn)行js代碼時(shí)犀暑,解析器和率先讀取到函數(shù)的聲明,并且使其在任何代碼被執(zhí)行前設(shè)置為可訪問狀態(tài)烁兰。而真正的函數(shù)表達(dá)式耐亏,則必須等到解析器執(zhí)行到了調(diào)用它的具體代碼時(shí),才會(huì)被解釋和執(zhí)行沪斟。

函數(shù)的聲明會(huì)被升格到代碼頂部广辰,而具體的定義只有在被調(diào)用的是皇后才會(huì)被解釋和執(zhí)行

為了驗(yàn)證這個(gè)結(jié)論,我們可以使用兩種函數(shù)定義的方式,檢查函數(shù)聲明的升格情況:

賦值型的函數(shù)定義報(bào)錯(cuò)了

這是因?yàn)橘x值的函數(shù)定義并不是函數(shù)聲明择吊,不會(huì)在代碼被解釋前執(zhí)行函數(shù)的升格操作李根。因此在運(yùn)行到console.log(sum2(a,b))時(shí),sum2并沒有被定義几睛,它也根本沒有指向文中定義的函數(shù)對(duì)象房轿,所以報(bào)錯(cuò)sum2 is not a function也不足為奇了。

5.3作為值的函數(shù)

因?yàn)槲覀兛梢詫⒑瘮?shù)名看做是指向函數(shù)對(duì)象的引用類型變量所森,因此囱持,可以將函數(shù)作為一個(gè)參數(shù)傳遞給另外一個(gè)函數(shù),就是理所當(dāng)然的了焕济。

這里sum1是作為內(nèi)部的參數(shù)變量而使用的纷妆。如果不將sum1寫入函數(shù)中,根據(jù)前面我們講過的標(biāo)識(shí)符解析流程吼蚁,他仍然可以在外層環(huán)境中找到該標(biāo)識(shí)符凭需。

除此之外,在一個(gè)函數(shù)中返回另外一個(gè)函數(shù)也是非常好的寫法:舉個(gè)例子肝匆,在一個(gè)函數(shù)的連環(huán)定義中粒蜈,內(nèi)容其實(shí)有三個(gè)參數(shù):propertyName,object1旗国,object2:

函數(shù)中返回一個(gè)函數(shù)

我們可以在外面的函數(shù)中傳入一個(gè)propertyName的值枯怖,隨后這個(gè)函數(shù)會(huì)返回一個(gè)函數(shù)的定義:

function(object1,object2){? do some things}

此時(shí)這個(gè)被返回的函數(shù)就可以在別的函數(shù)中作為一個(gè)參數(shù)被使用過了:最簡(jiǎn)單的使用例子就是我們定義比較函數(shù):

一個(gè)非常好的模塊化編程的例子

5.4函數(shù)內(nèi)部的屬性

函數(shù)內(nèi)部有兩個(gè)特殊屬性:arguments和this。

① arguments我們?cè)谇拔亩啻翁岬竭^能曾,他是一個(gè)類數(shù)組的保存參數(shù)的對(duì)象度硝,雖然arguments的主要用途是保存參數(shù)對(duì)象,但這個(gè)對(duì)象其實(shí)還有一個(gè)叫做callee的屬性寿冕,這個(gè)屬性是一個(gè)引用類型的指針蕊程,它指向擁有arguments對(duì)象的函數(shù)。

而我們可以使用它驼唱,在函數(shù)發(fā)生遞歸時(shí)藻茂,一旦想要改變函數(shù)名,那么遞歸就會(huì)失效玫恳,但是使用callee替代原來的函數(shù)名指向函數(shù)就不會(huì)有什么問題:

可以發(fā)現(xiàn)使用callee達(dá)到了相同的效果

② 函數(shù)內(nèi)部地另外一個(gè)特殊對(duì)象是this辨赐。this是在js編程中經(jīng)常搞不清楚的一點(diǎn)。但是書里有一句清晰的定義京办,即永遠(yuǎn)記住一句話:this指向的是函數(shù)據(jù)以引用的環(huán)境對(duì)象拧额∶呛危或者說坡疼,this的值就是據(jù)以執(zhí)行的環(huán)境對(duì)象。

換句話說叶雹,函數(shù)定義在哪個(gè)類里,它所指向的就是哪個(gè)類县袱。

第二次第三次結(jié)果不同浑娜,因?yàn)閳?zhí)行的環(huán)境對(duì)象不同

對(duì)于第一個(gè)this.color佑力,因?yàn)槠涠x在全局類里式散,環(huán)境對(duì)象為window,因此color為全局的red打颤。

對(duì)于第二個(gè)this.color暴拄,因?yàn)槠涫菑膐b1.f()發(fā)起的,環(huán)境對(duì)象為ob1,因此this指向ob1编饺,因此color為類內(nèi)的blue乖篷。

對(duì)于第三個(gè)this.color,雖然是在函數(shù)內(nèi)定義透且,但是因?yàn)闀?huì)發(fā)生函數(shù)定義升格撕蔼,因此其環(huán)境是全局類,環(huán)境對(duì)象為winodw秽誊,因此color為全局的red鲸沮。

但是在這里同時(shí)要注意,函數(shù)的名字僅僅是一個(gè)包含指針的變量锅论。因此讼溺,即便在不同的環(huán)境里,打印color得到不同的值最易,但其實(shí)全局的fun1與ob1.f兩個(gè)指針同樣指向一個(gè)函數(shù)怒坯。二者做邏輯判斷也會(huì)返回true。

③ 還有一個(gè)函數(shù)屬性叫做caller,它返回調(diào)用當(dāng)前函數(shù)的函數(shù)的引用藻懒。定義讀起來很繞剔猿,但是看個(gè)例子就明白了:

打印出的是fun1()的定義

5.5函數(shù)的屬性與方法

前文我們提到過,函數(shù)其實(shí)也是對(duì)象嬉荆,因此函數(shù)也有屬性和方法归敬。每個(gè)函數(shù)都有兩個(gè)屬性:length和protype,以及三個(gè)方法:apply和call员寇,和bind弄慰。

length為這個(gè)函數(shù)在定義時(shí)寫入的參數(shù)個(gè)數(shù)。

prototype為真正保存引用類型所有實(shí)例方法的地方蝶锋,它是函數(shù)的一個(gè)子對(duì)象陆爽,在第六章會(huì)詳細(xì)介紹這個(gè)屬性,在這先按下不表扳缕。另外慌闭,prototype屬性是不可以枚舉的别威,因此for-in無法發(fā)現(xiàn)該屬性。

展示對(duì)象自帶的方法

apply和call的用途都是在特定的作用域中調(diào)用函數(shù)驴剔。實(shí)際功能就是設(shè)置函數(shù)體內(nèi)this的值省古。

apply接受兩個(gè)參數(shù):1是特定的作用域,另外一個(gè)是參數(shù)數(shù)組丧失。而call與apply唯一的不同僅僅是call是填參數(shù)數(shù)組豺妓,而apply是把參數(shù)全部一個(gè)一個(gè)列進(jìn)去

首先運(yùn)行fun2時(shí)布讹,this指向window琳拭,因此this.c = 10,fun1的結(jié)果也就是13。

當(dāng)將d.f也指向函數(shù)fun2時(shí)描验,this指向了d白嘁,因此this.c = 20,fun1的結(jié)果也就變成了23膘流。

apply和call可以有效的指定函數(shù)在何種作用域運(yùn)行絮缅,我們可以首先定義類,再將不同的類作為環(huán)境傳入函數(shù)中去呼股,這時(shí)函數(shù)中的this.prototype的值就會(huì)變成不同環(huán)境域下的值耕魄。

而bind與前二者不同,bind是根據(jù)已有的函數(shù)復(fù)制一個(gè)新的函數(shù)卖怜,而這個(gè)新的函數(shù)的作用域和this指向的對(duì)象由開發(fā)人員自己決定屎开。一般使用可以分為三個(gè)步驟:

可以發(fā)現(xiàn),新的函數(shù)的作用域已經(jīng)被更換為了o马靠,因此即便是在全局話你就能夠下跑這個(gè)函數(shù)奄抽,仍然是采用o作為執(zhí)行環(huán)境對(duì)象。

另外其實(shí)每個(gè)函數(shù)也都有toLocaleString,toString,valueOf三個(gè)方法甩鳄,但是因?yàn)椴煌臑g覽器返回的值不同逞度,但基本上都是函數(shù)實(shí)現(xiàn)的內(nèi)容,這些信息在調(diào)試代碼時(shí)是比較有用的妙啃。在這就不多贅述了档泽。

上一張圖吧還是
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揖赴,隨后出現(xiàn)的幾起案子馆匿,更是在濱河造成了極大的恐慌,老刑警劉巖燥滑,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渐北,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铭拧,警方通過查閱死者的電腦和手機(jī)赃蛛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門恃锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呕臂,你說我怎么就攤上這事破托。” “怎么了歧蒋?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵土砂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疏尿,道長(zhǎng)瘟芝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任褥琐,我火速辦了婚禮,結(jié)果婚禮上晤郑,老公的妹妹穿的比我還像新娘敌呈。我一直安慰自己,他們只是感情好造寝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布磕洪。 她就那樣靜靜地躺著,像睡著了一般诫龙。 火紅的嫁衣襯著肌膚如雪析显。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天签赃,我揣著相機(jī)與錄音谷异,去河邊找鬼。 笑死锦聊,一個(gè)胖子當(dāng)著我的面吹牛歹嘹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孔庭,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼尺上,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了圆到?” 一聲冷哼從身側(cè)響起怎抛,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芽淡,沒想到半個(gè)月后马绝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吐绵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年迹淌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了河绽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唉窃,死狀恐怖耙饰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纹份,我是刑警寧澤苟跪,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蔓涧,受9級(jí)特大地震影響件已,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜元暴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一篷扩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茉盏,春花似錦鉴未、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讶迁,卻和暖如春连茧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巍糯。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工啸驯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳞贷。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓坯汤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀愧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惰聂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • ??引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例搓幌。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)迅箩,用于將數(shù)...
    霜天曉閱讀 1,059評(píng)論 0 1
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,209評(píng)論 0 3
  • 函數(shù)和對(duì)象 1溉愁、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來說都是核心的概念。通過函數(shù)可以封裝任意多條語(yǔ)句饲趋,而且...
    道無虛閱讀 4,566評(píng)論 0 5
  • ECMAScript關(guān)鍵字 delete do else finally function in instance...
    doudou2閱讀 721評(píng)論 0 0
  • 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 682評(píng)論 0 0