探索JS的函數(shù)表達式(你不知道的js)

函數(shù)是js中既強大又容易令人困惑的特性,首先定義函數(shù)的方法有兩種:函數(shù)聲明和函數(shù)表達式


定義函數(shù)的兩種方法

許多瀏覽器給函數(shù)定義了一個非標準的name屬性,console.log(functionName.name) =》 “functionName”,匿名函數(shù)的name屬性則是一個空的字符串

函數(shù)聲明的重要特征就是函數(shù)聲明提升鹅士,可以在聲明函數(shù)之前調(diào)用

在函數(shù)內(nèi)部使用函數(shù)聲明定義函數(shù)缘滥,只能創(chuàng)建局部函數(shù)


遞歸

遞歸函數(shù)是一個函數(shù)通過名字調(diào)用自身的情況下構(gòu)成的


遞歸

arguments.callee是一個指向正在執(zhí)行的函數(shù)的指針轰胁,在這里等同于factorial(num-1)


閉包

閉包就是指有權(quán)訪問另一個函數(shù)內(nèi)部變量的函數(shù),通常是一個函數(shù)包含一個函數(shù)的形式朝扼,這句話大多數(shù)前端er都知道赃阀,但如何去理解閉包呢

首先要理解作用域和作用域鏈的問題,當某個函數(shù)被調(diào)用時擎颖,會創(chuàng)建一個執(zhí)行環(huán)境以及相應(yīng)的作用域鏈榛斯,然后观游,使用arguments和其他命名參數(shù)來初始化函數(shù)的活動對象,在作用域鏈中驮俗,外部函數(shù)的活動對象始終處于第二位懂缕,外部函數(shù)的外部函數(shù)的活動對象處于第三位,以此類推王凑,直至全局對象搪柑,也就是作用域鏈的終點:全局執(zhí)行環(huán)境,舉個??


創(chuàng)建閉包函數(shù)

后臺的每個執(zhí)行環(huán)境都有一個表示變量的對象——變量對象索烹,全局環(huán)境的變量始終存在(window)工碾,而像createComparisonFunction()函數(shù)這樣的局部環(huán)境的變量對象,只在函數(shù)執(zhí)行時存在术荤,在創(chuàng)建createComparisonFunction()函數(shù)時倚喂,會預(yù)先創(chuàng)建一個包含全局變量對象的作用域鏈,被保存在內(nèi)部的[[Scope]]屬性中瓣戚,這個對象對應(yīng)的是一個對象的列表端圈,列表中的對象僅能javascript內(nèi)部訪問,沒法通過語法訪問子库。

當調(diào)用createComparisonFunction()函數(shù)時舱权,會為函數(shù)創(chuàng)建一個執(zhí)行環(huán)境,然后通過復制函數(shù)的[[Scope]]屬性中的對象仑嗅,構(gòu)建起執(zhí)行環(huán)境的作用域鏈宴倍。作用域鏈的本質(zhì)是一個指向變量對象的指針列表,只引用但不實際包含的變量對象仓技。


調(diào)用compareNames()函數(shù)的過程中產(chǎn)生的作用域鏈之間的關(guān)系

通常函數(shù)執(zhí)行完成鸵贬,就是銷毀局部活動對象,但上面的??中的匿名函數(shù)的作用域鏈包含了外部函數(shù)的活動對象脖捻,所以即使外部函數(shù)執(zhí)行完畢阔逼,其局部活動對象也不會銷毀,直到匿名函數(shù)被銷毀地沮。

閉包與變量

由于作用域鏈的配置機制是一個引用嗜浮,所以閉包只能獲取包含函數(shù)中任何變量的最終值。??

閉包函數(shù)的引用值

由于這里沒有參數(shù)傳遞摩疑,這里的i是作用域鏈中引用的對象危融,即使它的值是基本類型,所以這里輸出10個10雷袋。

想要獲得0-9這樣的結(jié)果吉殃,可以將i作為實參傳遞給匿名函數(shù)的形參,中間是有一個復制的操作,或者使用ES6的let蛋勺,詳情參考這里

this對象

this對象是在運行時基于函數(shù)的執(zhí)行環(huán)境進行綁定的速侈,全局環(huán)境中指向window,當函數(shù)被作為某個對象調(diào)用時迫卢,指向調(diào)用的對象。this始終指向直接調(diào)用它的對象冶共。

每個函數(shù)在被調(diào)用時乾蛤,會自動取得兩個特殊的變量this和arguments,內(nèi)部函數(shù)搜索這兩個變量時捅僵,只會在活動對象里搜索家卖,并不會向上查找∶沓可以通過變量賦值的方法實現(xiàn)訪問上荡。

內(nèi)存泄漏

眾所周知,js在函數(shù)執(zhí)行完畢后會通過垃圾回收機制將函數(shù)內(nèi)部的活動對象銷毀馒闷,而閉包函數(shù)由于作用域鏈一直引用對象酪捡,所以不能銷毀,這樣就很容易造成內(nèi)存泄漏問題纳账,所以使用的時候也要記得手動銷毀逛薇。


模仿塊級作用域

js是沒有塊級作用域的概念的,所以在塊語句中定義的變量疏虫,實際是包含在函數(shù)中的變量永罚,而非語句中的變量。

私有變量

任何函數(shù)中定義的變量卧秘,都可以認為是私有變量呢袱,因為不能從外部訪問到。

有權(quán)訪問私有變量和私有函數(shù)的公有方法叫特權(quán)方法

利用私有和特權(quán)成員翅敌,可以隱藏那些不想被直接修改的數(shù)據(jù)羞福。??

在構(gòu)造函數(shù)中定義特權(quán)方法

靜態(tài)私有變量

通過在私有作用域中定義私有變量和函數(shù),創(chuàng)建特權(quán)方法哼御。??

創(chuàng)建特權(quán)方法

這個??中的Person構(gòu)造函數(shù)和setName()和getName()方法一樣坯临,都有權(quán)訪問私有變量name,這種模式下恋昼,變量name就變成一個靜態(tài)的看靠,由所有實例共享的屬性。

模塊模式

模塊模式是為單例(只有一個實例)創(chuàng)建私有變量和特權(quán)方法液肌。??


模塊模式創(chuàng)建特權(quán)方法

這里的單例就是application挟炬,私有對象components數(shù)組,返回對象的getComponentCount()和registerComponent()方法都是有權(quán)訪問components對象的特權(quán)方法。

增強的模塊模式

在返回對象之前加入對其增強的代碼谤祖,這種模式適合那些單例必須是某種類型的實例婿滓,同時還必須添加某些屬性和方法對其增強情況。??


增強的模塊模式

小結(jié)

本文僅是個人的看法粥喜,如有錯誤和補充凸主,歡迎指正和交流。

參考紅皮書的一些學習所得

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末额湘,一起剝皮案震驚了整個濱河市卿吐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锋华,老刑警劉巖嗡官,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毯焕,居然都是意外死亡衍腥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門纳猫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婆咸,“玉大人,你說我怎么就攤上這事芜辕∩玫ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵物遇,是天一觀的道長乖仇。 經(jīng)常有香客問我,道長询兴,這世上最難降的妖魔是什么乃沙? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮诗舰,結(jié)果婚禮上警儒,老公的妹妹穿的比我還像新娘。我一直安慰自己眶根,他們只是感情好蜀铲,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著属百,像睡著了一般记劝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上族扰,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天厌丑,我揣著相機與錄音定欧,去河邊找鬼。 笑死怒竿,一個胖子當著我的面吹牛砍鸠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耕驰,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼爷辱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朦肘?” 一聲冷哼從身側(cè)響起托嚣,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厚骗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兢哭,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡领舰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迟螺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲秽。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矩父,靈堂內(nèi)的尸體忽然破棺而出锉桑,到底是詐尸還是另有隱情,我是刑警寧澤窍株,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布民轴,位于F島的核電站,受9級特大地震影響球订,放射性物質(zhì)發(fā)生泄漏后裸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一冒滩、第九天 我趴在偏房一處隱蔽的房頂上張望微驶。 院中可真熱鬧,春花似錦开睡、人聲如沸因苹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶檐。三九已至,卻和暖如春胁艰,著一層夾襖步出監(jiān)牢的瞬間蘸秘,已是汗流浹背官卡。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醋虏,地道東北人寻咒。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像颈嚼,于是被迫代替她去往敵國和親毛秘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • ??函數(shù)表達式是 JavaScript 中的一個既強大有容易令人困惑的特性。定義函數(shù)的的方式有兩種: 函數(shù)聲明限煞; ...
    霜天曉閱讀 817評論 0 1
  • 定義函數(shù)的方式有兩種:函數(shù)聲明和函數(shù)表達式抹恳。 函數(shù)聲明的一個重要特征就是函數(shù)聲明提升,意思是在執(zhí)行代碼前會先讀取函...
    oWSQo閱讀 665評論 0 0
  • 定義函數(shù)的方式有兩種:一種是函數(shù)聲明署驻,另一種就是函數(shù)表達式奋献。函數(shù)聲明的語法: 關(guān)于函數(shù)聲明的一個重要特征就是函數(shù)聲...
    LemonnYan閱讀 82評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評論 0 21