闭包
变量的作用域
变量的作用域,就是指变量的作用范围。在JS中,函数可以用来创造函数作用域。当在函数中搜索一个变量的时候,如果该函数内并没有声明这个变量,那么此次搜索的过程会随着代码执行环境创建的作用域链往外层逐层搜索,一直搜索到全局对象为止。变量的搜索是从内到外。
var a = 1; var func1 = function () { var b = 2; var func2 = function () { var c = 3; console.log(b); //输出:2 console.log(a); //输出: 1 } func2(); console.log(c); //输出:Uncaught ReferenceError: c is not defined(…) }; func1();
变量的生存周期
对于全局变量,全局变量的生存周期当然是永久的,除非我们主动销毁这个全局变量.
对于在函数中用var关键字声明的局部变量来说,当退出函数时,这些局部变量即失去了他们的价值,他们会随着函数调用的结束而被销毁。
闭包中的局部变量的生命会被延续。
var func = function () { var a = 1; return function(){ a++; console.log("a:" + a); }; }; var f = func(); f(); //输出 a:2 f(); //输出 a:3 f(); //输出 a:4
在执行var f = func();时,f返回了一个匿名函数的引用,它可以访问到func()被调用时产生的环境,而局部变量a一直处在这个环境中。既然局部变量所在的环境还能被外部访问,这个局部变量就有了不被销毁的理由。在这里产生了一个闭包结构,局部变量的生命看起来被延续了。
闭包的作用
1.封装变量
2.延续局部变量的寿命