var a = 2; // 聲明全局變量a
( function foo (globel) {
var a = 3;
console.log(a); // 調用局部變量 3
console.log(globel.a); // 調用全局變量 2
}
( window ));
console.log(a); // 調用全局變量 2
第二種寫法和第一種很像:
var a = 2; // 聲明全局變量a
( function foo (globel) {
var a = 3;
console.log(a); // 調用局部變量 3
console.log(globel.a); // 調用全局變量 2
} )( window ); // 后面加這個括號是為了立即執行這個包裝函數,並傳入參數window
console.log(a); // 調用全局變量 2
第三種是UMD模式(項目中被廣泛使用,盡管這種模式略顯冗長,但是更容易讓人理解):
var a = 2;
(function iife (def) {
def(window); // 2.執行def函數(def是被傳入的函數),調用def函數並傳入參數window.在下方執行代碼塊。
})(function def (globel) { // 1.將def函數作為參數傳入iife函數。
var a = 3;
console.log(a); // 打印局部變量 3
console.log(globel.a); // 打印全局變量 2
});
console.log(a); // 打印全局變量 2
topic: 這樣寫的好處是不會污染外部作用域。 比如 function foo () { ... } 這樣的函數是可以直接在外部調用的; 但是(function foo () { ... })這樣的函數聲明就只能在{ ... }內部調用了。
