要理解闭包的概念,先了解js执行函数的过程:
js在执行函数作用域之前,会将所有的变量按照 local global , closure 分类声明
1) var 声明的变量赋值 undeifned
2) function func() {} 形式定义的函数放在 Functions 中, function 在js中是一级对象,他可以拥有属性和方法,无论任何情况下都会有返回值; 当用new形式加载function时, 返回this; 其他除了显性定义 return, 返回值都是undefined;
3) 当js碰到每个每个函数作用域, 在声明函数作用域的本地变量的同时, 为所在函数的体内引用到的外界变量创建 closure; 在closure里面存储的变量有个神奇的地方: 它会对他内部所有的代码检查是否存在引用上下文变量的情况,如果存在,就将它引入 closure; (也可以看出为什么递归在js中国容易出现栈溢出的情况)
function say6() { //局部变量num最后会保存在闭包中 var num = 10; var say = function () { console.log(num); } num++; return say; } var sayNum = say6(); sayNum();//11