当一个内部函数被调用,就会形成闭包,闭包就是能够读取其他函数内部变量的函数就是一个函数去访问了另外一个函数的中的变量的函数。JavaScript(JS)变量可以是局部变量或全局变量。私有变量可以用到闭包。

1、变量生命周期

全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量在函数内部和外部都可以访问。而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。

2、闭包的作用

变量有两种类型:全局变量和局部变量。如果定义过多的全局变量,有可能造成全局变量冲突,也就是全局变量污染问题,闭包可以避免全局变量的污染,隔离变量的运行环境。可以读取函数内部的变量。

3、闭包的特点及用法

1)闭包的特点

占用更多内存;不容易被释放,

2)闭包用法

变量想要反复使用,而且要避免全局变量污染,就要使用闭包,JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。闭包的用法如下:

先定义外层函数,封装被保护的局部变量。然后定义内层函数,执行对外部函数变量的操作。外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。

例如,

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('cjavapy'); // 通过函数接口,修改了 secret 变量
foo.get_secret(); // 获得了 'cjavapy'


推荐文档