2017-03-23
文章来源:http://www.cnblogs.com/daysme
变量分为全局变量和局部变量。 他们之前是用函数隔开的。 除了函数,其他都没有作用域之说。 全局变量:可重用。易被污染。 局部变量:不会被污染,不能重用。 闭包:既能重用变量,又能保护变量不被污染。 在函数内声明一个函数,并把这个函数返回出来。 闭包就是能读取其他函数内局部变量的函数。因为只有函数内部的子函数才能读取局部变量, 因为可以把闭包理解为定义在一个函数内部的函数。 闭包的作用: 一个是可以读取函数内部的局部变量。 一个是让这些变量始终保存在内存中。 全局变量 var n=1; function fn(){ console.log(n); } fn(); 局部变量 function fn(){ var n=1; } fn(); console.log(n); //获取不到变量,并报错 返回变量-最初的闭包思想 function fn(){ var n=1; return 1; } var a=fn(); console.log(a); 闭包,其实就是一种函数。 function fn(){ var n=1; return function(){ console.log(n) }; } var a=fn(); a(); 例子: function fn(){ var n=1; add=function(){ n++; } function fn1(){ console.log(n); //获取变量 } return fn1; //返回出来 } var result=fn(); //保存到全局变量中 result(); add(); result(); 此时 fn 中的局部就是一直保存在内存中,并没有在fn被调用后销毁。 为什么没有被销毁?因为 fn1() 被返回出来并且由全局变量接收保存了, 全局变量result是不会被销毁的,但result的值是fn1,fn1的值引用着 fn() 中的 n ,所以 fn 也不会被删除。 闭包三个步: 1.外层函数包裹着受保护的变量和操作变量的内层函数。 2.外层函数把内层函数返回到函数外。 3.使用者调用外层函数,获得内层函数。 此时被返回出来的函数就叫闭包。 闭包形成的原因: 外层函数的作为域对象无法释放。 例,没用到上层函数的任何东西。 var name='the window'; var objcet={ name:'my objcet', getname:function(){ return function(){ return this.name; } } } console.log(objcet.getname()()); 例, 指向obj的this 已经保存在内存中。 var name='the window'; var objcet={ name:'my objcet', getname:function(){ var that=this; return function(){ return that.name; } } } console.log(objcet.getname()());