一、闭包
闭包的概念:在两个(或者多个)函数发生嵌套时,将内部的函数保存到外部时就会形成闭包。
function a(){
var aaa = 123;
funcrion b(){
console.log(aaa)
}
return b;
}
var glob = 100;
var test = a();
test(); //123
- 在函数a定义时,它的作用域链的顶层是只有Global Object
- 当a执行时,它会创建自己的AO对象,并将自己函数内部的变量和函数挂载到自己的AO对象中
-
当函数b定义时,因为他是在a函数内定义的,所以他的作用域链中生来就有a函数的AO对象和GO对象
-
当return b执行完毕的时候,a函数被销毁,但是我们需要知道的是销毁的只是他们之间的箭头,也就是地址
-
当执行b函数时,a函数的AO对象依旧存在于b函数的作用域链中,所以AO对象中的属性以及值b函数依旧可以通过作用域链查找到,这时就形成了闭包。
二、闭包的应用
- 实现共有变量(例如累加器)
function test(){ var count = 0; return function(){ count ++; console.log(count); } } var demo = test(); demo();//1 demo();//2 ...
可以做缓存
function test(){ var str = ''; function push(n){ str += n; console.log(str); } return push; } var demo = test(); demo('ttttt');// ttttt
可以实现封装,属性私有化
var inherit = (function(){ var F = function(){}; return function(target,origin){ F.prototype = origin.prototype; target.prototype = new F(); target.prototype.constructor = target; target.prototype.uber = origin.prototype; } }());
模块化开发,防止变量污染