错误之处,欢迎指正。
使用var
关键字,在全局作用域中声明变量会造成全局对象污染。
var a = 1;
console.log(a) //1
console.log(window.a) //1
写在函数作用域中,就完全不会造成全局对象污染。
function test() {
var a = 1;
console.log(a); //1
console.log(window.a); //undefined
}
但是此时test
函数造成了全局对象污染。
function test() {
var a = 1;
}
console.log(test); //函数体
console.log(window.test); //函数体
当函数成为一个表达式时,它不会污染全局对象,可以使用小括号将函数用括起来,来把函数变为一个函数表达式。
var test = function () {
console.log(123);
}
上面这种也是使用函数表达式的方式来声明函数,函数表达式不会带来函数提升。
(function test() {});
console.log(test); //test is not defined
console.log(window.test); //undefined
此时带来了一个问题,无法使用函数名对函数进行调用,那么函数也就没有办法执行。
函数表达式的方式会把函数体返回,所以在表达式后面添加小括号,就相当于执行了这个函数。
(function test() {
var a = 1;
console.log(a) //1
})(); //可以理解为test();
上面的函数称之为立即执行函数(IIFE)