錯誤之處,歡迎指正。
使用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ù)體
當函數(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ù)體返回,所以在表達式后面添加小括號,就相當于執(zhí)行了這個函數(shù)。
(function test() {
var a = 1;
console.log(a) //1
})(); //可以理解為test();
上面的函數(shù)稱之為立即執(zhí)行函數(shù)(IIFE)