含义:闭包是一个概念,它描述了函数执行完毕内存释放后,依然内存驻留的一个现象,只要把握这个核心概念,闭包就不难理解了数组
function
a(){
var
i=0;
function
b(){
alert(++i);
}
return
b;
}
var
c = a();
c();
|
即,闭包的做用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,由于a的内部函数b的执行须要依赖a中的变量。闭包
因为闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。函数
闭包的概念:函数对象能够经过做用域链相互关联起来,函数体内的变量能够保存在函数做用域内,这种特性被称为闭包。spa
var scope='global scope'; code
function checkscope(){对象
var scope="local scope"; ip
function f(){ return scope; } 内存
return f; ci
} 资源
checkscope()();
咱们知道调用函数checkscope(),咱们获得的再也不是一个scope值,而是一个函数f;再接着调用函数f(),这里就出现了一个问题,调用函数f是在全局环境中调用,其中的scope值从何而来?上面提到过一个概念:js是采用的词法做用域,该scope值仍是来自于该函数即f定义时的做用域,而不是调用时的做用域。因此结果仍是local scope。
在犀牛书上还碰见一个例子比较经典。见代码:
function constfuncs(){
var funcs=[];
for(var i=0;i<10;i++){
funcs[i]=function{ return i ; }
}
return funcs;
}
var funcs=constfuncs();
funcs[5]()
此时,结果的返回值是10;
结合上面的概念一步一步分析:
首先,constfuncs()函数执行之后获得的是funcs数组,数组中是十个未执行的函数function(){return i}。当调用funcs[5]()的时候,变量i的值应该是函数在定义的时候i的取值,又由于直到i=10的时候循环才中止,因此,最后i的取值是10.函数调用返回值也是10。
从这里不能看出:关联到闭包的做用域链是“活动的”。嵌套函数不会将做用域内的私有成员复制一份,也不会对所绑定的变量生成静态快照。