先看小题一道
//代码4
var a = 2;
(function(){
console.log(a)
a = 5
console.log(a);
console.log(window.a);
var a = 20
console.log(a);
})()
//虽然它能够正确的执行,但是严格意义上来说,它并不是一个闭包,
// 因为它不是在本身的词法作用域之外执行的。
// 它确确实实产生了闭包的效果,因此也有种说法叫他为小闭包。
这里使用到了立即执行函数,这是一个被称为 自执行匿名函数 的设计模式,主要包含两部分。第一部分是包围在 圆括号运算符 () 里的一个匿名函数,这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。
第二部分再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。
当函数执行时,不能访问其外部变量。所以第一个a只是在函数中定义了还没赋值所以输出undefined,第二个a已经被赋值为5,输出5,第三个window.a是2,第四个相当于赋值a=20,输出20。