函数在创建它的环境之外执行,那么它就是闭包。
如上例子中,函数displayName 如果在创建它的环境中:makeFunc函数内执行,则不叫闭包了。
闭包会记住创建它的环境。创建它的环境包含所在环境的局部变量,这也就是说为什么闭包能够使得外部空间访问到函数的局部变量的原因,同时也是发生内存泄漏的导火索。
上面的例子我们认识到: * function可以不用写方法名。 * 两次对makeAdder的调用,虽然是同一makeAdder函数,但是对于返回的闭包来说,创建闭包的环境是二者是独立的,没有瓜葛。
咋一看,看不懂,那么像剥洋葱一样一层层的解析:
我可以如此改写一下:
var makeCounter = function() { var privateCounter=0; function changeBy(val) { privateCounter += val; } return { increment:function() { changeBy(1); }, decrement:function() { changeBy(-1); }, value:function() { return privateCounter; } } } var counter = makeCounter();为什么难看懂呢?就是因为将上面两步合成了一步。使用句式是:
(function() {....})()定义闭包和执行闭包一块做了,确实奇特!
关注一下闭包的返回:
return { increment:function() { changeBy(1); }, decrement:function() { changeBy(-1); }, value:function() { return privateCounter; } }这返回的其实是一个对象。而在js中对象的定义是什么样的呢?
只不过上面的demo中,每个value对应的值都是一个闭包而已。
counter拿到了对象,那么外部空间只能调用到对象的increment,decrement,value属性,但是却无法直接调用到changeBy,privateCounter,他们被隐藏起来了,类似于java类中的private.
除非必须,勿用闭包,对性能影响大。
http://edu.csdn.net/course/detail/800/10909?auto_start=1 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures