1

如果我将代码复制到这样的闭包中

(function(){
    var private1 = {},
        private2 = {},
        publik;

    publik.get(object){
         private1[object.name] = object;
    };

    window.publik = publik;
}())


publik.get({
    // API
    name: 'name_foo',
    functionA: function(){
        // I can not access private2 in here
    },
    functionB: function(){}
})

有没有一种 API 可以工作的方法,以便 functionA 和 functionB 可以访问闭包内的 private 2。

它们将被复制到闭包中,因此复制的版本应该可以访问它。这就是为什么我进行关闭并将 private1 和 private2 像这样放在一起的原因。

对象的书面版本(不是复制版本)在 jslint 中引发错误,我猜这是因为它违反了范围规则。

函数参数(不是参数)是全局范围内的未命名变量,无法访问闭包。

(直到被复制到其中:)

如果我做了private1并且private 2同一个对象说......只是private......然后使用this关键字访问它,它会起作用吗?

不过,我更愿意将它们分开。

4

1 回答 1

1

您的代码有语法错误,并且get似乎更好地命名为set。此外,您的代码似乎并不特定于浏览器,因此最好使用更通用的全局对象而不是特定的窗口对象。

考虑类似的事情:

(function(global){
    var private1 = {name: 'private1'},
        private2 = {name: 'private2'},
        publik;

    publik = {
      set: function (object) {
        private1[object.name] = object;
      }
    };

    global.publik = publik;
}(this))

publik.set方法可以通过闭包访问private1private2 您可以通过 Douglas Crockford 在他的文章Private Members in JavaScript中解释的特权方法访问它们。扩展上述内容,可能是:

    publik = {

      set : function (...) {
        ...
      },

      getPrivate1: function (name) {
        return (typeof name == 'string')? private1[name] : private1;
      },

      ...

    };
于 2012-10-10T23:39:06.053 回答