1. 程式人生 > >JavaScript關於閉包,匿名函式,this,物件等的一些理解

JavaScript關於閉包,匿名函式,this,物件等的一些理解

        閉包原本就是指所有的函式,但我們一般是指能夠讀取其他函式內部變數的函式,主要有兩個作用:一個是可以讀取函式內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。當函式a的內部函式b被函式a外的一個變數引用的時候,就建立了一個閉包。匿名函式不但可以省去命名的問題,同時可以提高程式的安全性,增加內聚。this指標的作用物件取決與其所在的執行環境,閉包是執行在Window全域性的,所以閉包裡面的this也是指向Window的。在JavaScript中一切都可以看見作物件,變數,函式等都可以用來建立物件。在JS中屬性是公有的,但是有私有變數,使用var定義就是私有變數,同時也沒有塊級作用域的概念(注:for(var i=0;i<5;i++),i存在於整個函式),那怎麼才能訪問私有變數以及仿造塊級作用域,跟其他語言一樣的效果呢?閉包+匿名函式就派上用場了。塊級作用域可以使用自我執行來解決(注:function(){}()),為什麼?這裡要引入作用域鏈和記憶體回收的概念了。JS 中物件之間的關係是從下往上的,也就是說如果子函式還在引用,那麼以上的所有父函式都不會被回收,所以上面的for迴圈就可以放在函式閉包裡面自我執行,完了後,i就被回收了,相當於塊級變數。

        既然通過閉包等方式可以創建出跟其他語言一樣的物件,那麼也肯定可以達到一些特殊的模式設計效果了。比如,靜態變數,單例模式。使用prototype使方法(如建構函式等)共享,從而使相應的變數變成靜態變數。

        JS相對於C++而言更加面向物件(貌似是個廢話),兩個語言的所有用法不同之處就在於此,JS中的許多特性就是強制要使用者養成面向物件的概念,在語言層面很自然的能夠設計出高內聚,低耦合的程式來。比較適合初學者,但C++更加自由化一些,要有一定的功力才能達到這樣的效果。