var a = 2;
var func = (function(){闭包
var a = 3; return function(){ a++; console.log(a); }
})();函数
func();
func();code
1.涉及的知识点:
(1)JS变量的做用域
(2)闭包
2.变量的做用域,通俗来讲就是变量所能起到做用的范围,也就是变量能被访问到的范围。
对于变量的做用域的理解,有一下几点须要了解的:
(1)变量的做用域不是“块级”,而是以“函数”为做用域ip
这个所说的的“块级”,指的是距离“代码”最近的代码块。好比举个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)。 这里说闭包的一个做用:使函数能够维持其建立时所在做用域。 怎么理解这句话呢? 也就是说一个函数离开了“建立时的做用域”,可是其仍是会和这个做用域以及这个函数外部的做用域相关联,也就是说“变量”依旧是那个“变量” 以这个题目为参照,那么结果就很明了了。