0

私は明らかにするモジュールパターンが好きです。公開して返却したいプライベート機能を用意します。しかし、私はまた、「これを返す」私の明らかにするモジュールパターン内にいくつかのローカル関数を持っているかもしれません...

var player = function(){
//my local variable scope...

oplayer.damage = function(){
    if(!this.grace){
        this.shield--;
        if (this.shield == 0){
            return this;
        }
    }
};
      ...

      return {
      damage : oplayer.damage
      }
      }();

明示的に何かを返す場合、「これを返す」ことは大丈夫ですか?(公開モジュールパターンの使用に関連して)。そうでない場合、適切なコンテキストで使用されるようにローカル関数oplayer.damageを変換するにはどうすればよいですか?アドバイスありがとうございます!「これを返す」というコンセプト全体に頭を悩ませようとしているだけです。

4

2 に答える 2

1

thisまず、キーワードが何であるかを確認してください。MDNには優れた紹介があります。

明示的に何かを返す場合、「これを返す」ことは大丈夫ですか?

はい、もちろん。これは、メソッドの連鎖可能性のデフォルトのパターンです。すべてが、呼び出されたオブジェクトを返します。ただし、それを信頼するには、シールドが下がっているときだけでなく、すべての場合にそれを返す必要があります。

これが目的ではない場合は、通常のreturn;ステートメントを使用してください(結果はundefinedreturnステートメントなしのようになります)。

明らかにするモジュールパターンの使用に関連して

その関数をどこで定義したかはまったく問題ではありません。

適切なコンテキストで使用されるように関数を変換しますか?

(「コンテキストthis」では、ここでオブジェクトを参照していると思います)

実際にはできません。の値はthis常に関数の呼び出しに依存します。もちろん、.bind()関数をオブジェクトに追加することも、。の代わりにplayer直接返すこともできます。playerthis

于 2012-10-02T14:03:40.583 に答える
1

「これ」は実行のコンテキストであるため、問題ないはずです。「カットダウン」オブジェクトの一部であるパブリック関数でこれを返すため、カットダウンオブジェクトのみを取得します。したがって、次のシナリオを検討すれば、あなたがやろうとしていることはうまくいくはずだと思います。

var test = function(){
   var pri = function(){
       console.log("Private");
   };

   var pub = function(){
       pri();
       console.log("pub");
       return this;
   }

   return {
       pub: pub
   };
}();

console.log(test.pri); //-> undefined
console.log(test.pub); //-> function(){…}
console.log(test.pub()); //-> "Private" "pub" [Object {…}]
console.log(test.pub().pri); //-> "Private" "pub" undefined
于 2012-10-02T14:06:02.580 に答える