1拉一、定義函數(shù)的兩種方式:
1)函數(shù)聲明:存在函數(shù)聲明提升
2)函數(shù)表達(dá)式:使用前必須先賦值驼修;匿名函數(shù)(拉姆達(dá)函數(shù))
2锭碳、關(guān)于遞歸:
arguments.callee()指向正在執(zhí)行的函數(shù)的指針(嚴(yán)格模式下會報錯瓤漏,嚴(yán)格模式下改用函數(shù)表達(dá)式)
3扰付、閉包:有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)
創(chuàng)建閉包的常見方式:在一個函數(shù)中創(chuàng)建另一個函數(shù)
來更通俗地理解一下:
我們用“變量對象”這個名詞來表示執(zhí)行環(huán)境
全局變量的“變量對象”一直存在
函數(shù)的“變量對象”只有在執(zhí)行的時候才存在
創(chuàng)建函數(shù)的時候此叠,會創(chuàng)建包含全局“變量對象”的作用域鏈
調(diào)用函數(shù)的時候纯续,有了執(zhí)行環(huán)境,作用域鏈就加上了該函數(shù)的“變量對象”
作用域鏈的組成:
arguments和其他命名參數(shù)的值初始化的活動對象------>
外部函數(shù)的活動對象------>
外部函數(shù)的外部函數(shù)的活動對象------>
..........------>
全局執(zhí)行環(huán)境
作用域本質(zhì)上是:指向變量對象的指針列表
外部函數(shù)執(zhí)行完以后灭袁,作用域鏈就會被銷毀猬错,但是直到包含的匿名函數(shù)銷毀后,他的活動對象才會被銷毀茸歧。
由于閉包攜帶包含它的函數(shù)的作用域倦炒,占用內(nèi)存更多,因此應(yīng)該慎重考慮使用它软瞎。
4逢唤、匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此this總是指向window
解決辦法:在創(chuàng)建閉包铜涉,也就是匿名函數(shù)之前智玻,就把this的值轉(zhuǎn)移賦值給另一個變量(例如that)
5、比較重要的一點(diǎn):匿名函數(shù)之模仿塊級作用域(私有作用域)
(function () {}) ();
避免向全局作用域中添加過多的變量和函數(shù)芙代,團(tuán)隊(duì)合作中很容易導(dǎo)致命名沖突吊奢。
6、私有變量包括函數(shù)的參數(shù)纹烹、局部變量页滚、函數(shù)內(nèi)部定義的其他函數(shù)
可以利用閉包來創(chuàng)建私有變量的共有方法(特權(quán)方法)
1)利用構(gòu)造函數(shù),缺點(diǎn)是對于每一個新實(shí)例都要創(chuàng)建一組同樣的方法組
2)靜態(tài)私有變量:利用了塊級作用域和原型模式铺呵,達(dá)到了方法復(fù)用裹驰,但是實(shí)例們沒有屬于自己的私有變量
*sp1)為單例創(chuàng)建特權(quán)方法:返回對象(特權(quán)方法在這)的匿名函數(shù)。
補(bǔ)充一下:js通過對象字面量來創(chuàng)建單例片挂,單例通常都是作為全局對象存在的幻林。
*sp2)適合特定類型----增強(qiáng)的模塊模式:先new再返回一個對象(帶有公共屬性和特權(quán)方法)