标签:
闭包是什么?
闭包,在函数中定义实例(局部)变量,而这些变量能在函数中保存到函数的实例对象销毁为止, 其它代码块能通过某种方式获取这些实例(局部)变量的值并进行应用扩展。
如果还是不明白,那么我们再简化一下:闭包,其实就是指程序语言中能让代码调用已运行的函数中所定义的局部变量。
现在我们看一个例子:
var abc=function(y){ var x=y;// 这个是局部变量 return function(){ alert(x++);// 就是这里调用了闭包特性中的一级函数局部变量的x,并对它进行操作 alert(y--);// 引用的参数变量也是自由变量 }}(5);// 初始化 abc();// "5" "5" abc();// "6" "4" abc();// "7" "3" alert(x);// 报错!“x”未定义!
以我的理解来说吧。是否应用了闭包特性,必须确定该段代码有没有最重要的要素:未销毁的局部变量。那么很显然,没有任何实现的匿名函数不可能应用了闭包特性。但如果匿名函数里面有实现呢?那也还得确定它的实现中有没有用到那些未销毁的局部变量。
看一个例子:
var foo = (function () { var secret = ‘secret‘; // “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的 return { get_secret: function () { // 通过定义的接口来访问 secret return secret; }, new_secret: function (new_secret) { // 通过定义的接口来修改 secret secret = new_secret; } }; } ()); foo.get_secret(); // 得到 ‘secret‘ foo.secret; // Type error,访问不能 foo.new_secret(‘a new secret‘); // 通过函数接口,我们访问并修改了 secret 变量 foo.get_secret(); // 得到 ‘a new secret‘
之所以可能通过这种方式在 JavaScript 种实现公有,私有,特权变量正是因为闭包,闭包是指在 JavaScript 中,内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
标签:
原文地址:http://www.cnblogs.com/chrisghb8812/p/5651091.html