var a = 2;
var func = (function(){
var a = 3;
return function(){a++;console.log(a);
}
})();
func();
func();
1.涉及的知识点:
(1)JS变量的作用域
(2)闭包
2.变量的作用域,通俗来说就是变量所能起到作用的范围,也就是变量能被访问到的范围。
对于变量的作用域的理解,有一下几点需要了解的:
(1)变量的作用域不是“块级”,而是以“函数”为作用域
这个所说的的“块级”,指的是距离“代码”最近的代码块。比如举个C#的例子:public void Param(){var a = 1;if(a==1){var b = c;}}变量a的作用域就是 Param()这个代码快,而变量b的作用域的作用域就是if所表示的代码块。来看个JavaScript的例子:function param () {{var a = "liyunhua"}console.log(a); // 输出 liyunhua}console.log(a) // error变量a在params()中都是可以被访问的,而出了param()的范围就会报错。
(2)变量的覆盖:“一个作用域中存在一个与外层作用域的同名变量,那么在内部作用域以及其内部的所有的作用域中都访问不到外面的变量”--摘自《深入理解JavaScript》
这句话还是比较好理解的。这里就不做解释了。理解了上面的两点,那么在立即执行函数表达式(IIFE)中,a的初始值就是3,并且不会影响到外部作用域变量a的值。执行函数(IIFE)中,a的初始值就是3,并且不会影响到外部作用域变量a的值。
3.闭包闭包的东西太多,这里就以题论题,不会过多地讲述闭包的知识点。有兴趣的朋友,可以去这个链接了解 (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures)。这里说闭包的一个作用:使函数可以维持其创建时所在作用域。怎么理解这句话呢?也就是说一个函数离开了“创建时的作用域”,但是其还是会和这个作用域以及这个函数外部的作用域相关联,也就是说“变量”依旧是那个“变量”以这个题目为参照,那么结果就很明了了。