錯誤之處磁滚,歡迎指正佛吓。
使用var
關(guān)鍵字,在全局作用域中聲明變量會造成全局對象污染恨旱。
var a = 1;
console.log(a) //1
console.log(window.a) //1
寫在函數(shù)作用域中辈毯,就完全不會造成全局對象污染。
function test() {
var a = 1;
console.log(a); //1
console.log(window.a); //undefined
}
但是此時test
函數(shù)造成了全局對象污染搜贤。
function test() {
var a = 1;
}
console.log(test); //函數(shù)體
console.log(window.test); //函數(shù)體
當(dāng)函數(shù)成為一個表達式時,它不會污染全局對象钝凶,可以使用小括號將函數(shù)用括起來仪芒,來把函數(shù)變?yōu)橐粋€函數(shù)表達式。
var test = function () {
console.log(123);
}
上面這種也是使用函數(shù)表達式的方式來聲明函數(shù)耕陷,函數(shù)表達式不會帶來函數(shù)提升掂名。
(function test() {});
console.log(test); //test is not defined
console.log(window.test); //undefined
此時帶來了一個問題,無法使用函數(shù)名對函數(shù)進行調(diào)用哟沫,那么函數(shù)也就沒有辦法執(zhí)行饺蔑。
函數(shù)表達式的方式會把函數(shù)體返回,所以在表達式后面添加小括號嗜诀,就相當(dāng)于執(zhí)行了這個函數(shù)猾警。
(function test() {
var a = 1;
console.log(a) //1
})(); //可以理解為test();
上面的函數(shù)稱之為立即執(zhí)行函數(shù)(IIFE)