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(){}
})

functionAとfunctionBがクロージャー内のプライベート2にアクセスできるように、APIが機能する方法はありますか?

それらはクロージャーにコピーされるので、コピーされたバージョンはそれにアクセスできるはずです。そのため、私はクロージャーを作成し、private1とprivate2をそのように組み合わせました。

オブジェクトの記述バージョン(コピーバージョンではない)はjslintでエラーをスローしますが、これはスコープルールに違反しているためだと思います。

関数の引数(パラメーターではない)は、グローバルスコープ内の名前のない変数であり、クロージャーにアクセスできません。

(がコピーされるまで:)

私が作成private1private 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にアクセスできます。ダグラス・クロックフォードの記事「 JavaScriptのプライベートメンバー」で説明されているように、特権メソッドを介してこれらにアクセスできます。上記を拡張すると、次のようになります。

    publik = {

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

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

      ...

    };
于 2012-10-10T23:39:06.053 に答える