Js如何構造塊級作用域,構造私有變數
阿新 • • 發佈:2018-12-24
眾所周知,Js是沒有塊級作用域的,但可以使用匿名函式來模仿塊級作用域。
1. for迴圈中定義的變數,從他有定義開始就可以在函式內隨處訪問他。
可以看出,for迴圈內定義的變數並沒有塊級作用域。注意:必須呼叫函式,函式內的變數才可以宣告。
2. 用匿名函式來模仿塊級作用域(私有作用域)
這裡在塊級作用域(私有作用域)可以訪問count的原因是,匿名函式是外部函式的內包。
優點:這種做法可以減少內包占用的記憶體問題,因為沒有指向匿名函式的引用,只要函式執行完畢,就可以立即銷燬函式的作用域鏈了。
3. 私有變數:函式的引數、區域性變數、在函式內定義的其他函式(閉包)
這裡,外部不能直接修改私有的屬性,只能通過特權方法(公有方法)來修改和訪問屬性和方法
缺點:使用建構函式模式來定義特權方法(公有方法),使得每個例項都會建立同樣一組新方法。解決辦法:建立靜態私有變數。
4. 靜態私有變數。私有函式和變數是所有例項都共享的,即每個例項都沒有自己的私有變數。
這裡的Person建構函式是一個全域性變數(因為1. 使用的函式表示式宣告的而不是函式宣告----函式宣告只能建立區域性函式。2. 沒有使用var關鍵字宣告Person---初始化未宣告的變數會建立一個全域性變數),所以能在私有作用域之外被訪問。
5. 模組模式(用於為單例建立私有變數和特權方法)。上述兩種都是為自定義物件建立私有變數和特權方法
單例模式:
模組模式:
6. 增強模組模式(適合單例必須是某種型別的例項)