JavaScript的自執行方法和模組模式
阿新 • • 發佈:2019-01-09
首先,每個方法定義的區域性變數,在外部是無法訪問的,比如:
function foo(){
var name;
}
這裡的name變數對外界沒有任何的汙染,不會影響到其他地方的程式碼。如果每個模組的程式碼都這樣寫,那麼就都不會打架了。
利用的函式的這一特性來實現隔離非常有效。通常情況下,我們只需要一個匿名的自執行函式就可以了:
(function(){
var name = 'Tom';
return name;
})()
如果僅僅是return一個name那大可沒必要這麼幹,我們需要返回一個具有類似JavaBean讀寫功能的物件:
(function (){
var name = 'Tom';
var age = 10;
return {
name :name,age:age
}
})()
這裡返回了一個JSON物件,既然是物件,那麼完全可以是有方法的:
(function(){
var name = 'Tom';
var age = 10;
return {
name:name,age:age,
setName(n){
name = n;
},
setAge(a){
age = a;
}
}
})()
是的,不光可以有方法,方法中竟然還能訪問早已經執行完畢了的那個自執行方法的變數。真的很神奇。
神奇的背後其實是閉包在起作用。自執行方法雖然早在setName和setAge方法之前就已經執行完畢了,但因為後兩個方法的定義中引用到了自執行方法中的變數。那麼JavaScript引擎在為後兩個函式建立閉包的時候會將自執行方法的變數“保留”。
這樣就實現了程式碼的隔離(避免帶來汙染)還能合理訪問的目的。