码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript闭包

时间:2016-07-07 19:51:03      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

闭包是什么?

闭包,在函数中定义实例(局部)变量,而这些变量能在函数中保存到函数的实例对象销毁为止, 其它代码块能通过某种方式获取这些实例(局部)变量的并进行应用扩展。
如果还是不明白,那么我们再简化一下:闭包,其实就是指程序语言中能让代码调用已运行的函数中所定义的局部变量
现在我们看一个例子:

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 中,内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后

关于为什么在 JavaScript 中闭包的应用都有关键词“return”,引用 JavaScript 秘密花园中的一段话:
闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。


 

Javascript闭包

标签:

原文地址:http://www.cnblogs.com/chrisghb8812/p/5651091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!