如何在没有全球曝光的情况下在两个闭包之间共享数据?

时间:2014-06-24 08:07:18

标签: javascript scope closures private

我设置了两个封闭的范围,其中一个依赖于另一个。通常,我通过将数据暴露到全局范围来共享数据(在这种情况下,是一个带有原型的函数),如下所示:

(function(){

    var thing;

    /* ... */

    window.thing = thing;

}());

(function(){

    /* I now have access to 'thing' */

}());

是否存在可以共享数据而不将其暴露给整个窗口的模式?

2 个答案:

答案 0 :(得分:2)

这只能通过使两个闭包本身成为另一个闭包的子作用域,并使共享数据成为父闭包中的局部变量来实现:

(function() {

    var thing = 'foo';

    (function f1() {
        // thing is accessible here
        ...
    })();

    (function f2() {
        // and here!
        ...
    })();
})();

注意:闭包是一个词汇结构,这意味着这两个函数必须都在同一个源单元中。

答案 1 :(得分:1)

@Alnitak为您提供了一个很好的解决方案。

但只扩展你的例子,你也可以这样做:

(function (xyz) {
      var thing = "foo";

      xyz.thing = thing;
}(closure1 = {}));

然后你可以像:

(function(){

    /* I now have access to 'thing' */
    alert(closure1.thing);
}());