1、变量作用域
变量的作用域就是指变量的有效范围。
在函数中声明一个变量的时候,如果该变量前面没有带上var关键字,那么就是全局变量。用var关键字在函数中声明变量,这时候的变量即是局部变量。只有在该函数内部才能访问到这个变量,在函数外部是访问不到的。
var func=function(){
var a=1; //a是局部变量
alert(a); //1
}
func();
alert(a); //输出引用错误的问题
在js中,函数可以用来创建函数作用域的,在函数里面可以访问外面的变量,但是函数外面则无法看到函数里面的变量。因为函数在搜索一个变量的时候,是从作用域链的最顶端到最末端一层一层的搜索。
2、变量的生存周期
对于全局变量来说,全局变量的生存周期是永久的,除非我们主动销毁这个全局变量。(对于非对象型的全局变量会被自动回收即栈类型:number,string,boolean,underfined)
那么所有的局部变量在执行完函数的时候,都会被自动的销毁。(闭包结构的函数除外)
var func=function(){
var a=1;
console.log(a++);
}
func(); //1
var func=function(){
var a=1;
return function(){
a++;
console.log(a)
}
}
var f=func();
f(); //2
f(); //3
如上两段代码做比较:
第一段代码无论怎么执行该函数,输出的永远是1;因为函数执行完毕,执行上下文环境和局部变量随之消失。第二段代码每执行一次函数,函数的输出值就加1。也就是说局部变量a的值并没有消失,原因是闭包的[[Scope]]属性包含了与执行环境作用域链相同的对象的引用;第二个函数返回了一个匿名函数的引用,它可以返回func()被调用时产生的执行,而局部变量a一直在这环境里面。闭包是一种能够在函数声明过程中将环境信息与所属函数绑定在一起的数据结构
那么闭包能拿来干什么呢?
1、如上所述:将全局变量封装成私有变量。
2、延续局部变量的生命