0

現在の JavaScript コードがどのように機能するかを理解するのが困難です。イベント ハンドラ クロージャからプライベート オブジェクト メソッドにアクセスする際の問題は解決できましたが、なぜそうなるのか知りたいです。

このコードは、よく知られているモジュール/プラグインの比喩を利用しています。

(function(module, $, undefined)
{
  function myPrivateCode(e){ /*...*/ }

  module.myPublicCode = function(e) { /*...*/ }

  module.init = function()
  {
    var that = this;
    $('.clickable').click(function(e)
    {
      if($(e.target).hasClass('classX'))
      {
         that.myPublicCode(e.target); // requires 'that' to work
      }
      else
      {
         // that.
         myPrivateCode(e.target);     // will fail if 'that' uncommented
      }
    });
  }

}(window.module = window.module || {}, jQuery ));

コードでは、パブリック メソッドまたはプライベート メソッドのいずれかを呼び出すクリック ハンドラーを設定します。オブジェクト参照をイベント ハンドラー クロージャーに渡す必要があることは完全に考えられますが、これはthatローカル変数によって行われます。私にとって奇妙なのは、参照としてmyPrivateCode必要とせずthat、「プライバシー」のために失敗することです。myPrivateCodeこれは、適切なオブジェクトにアクセスしておらず、期待どおりに動作していないと思わせます。誰かが何が起こるか説明できますか? 確かに私は何かが欠けています。

4

2 に答える 2

0

への呼び出しmyPrivateCode(e.target);は、関数にハンドラーとして渡す無名関数のコンテキストで実行されていclickます。

詳細については、クロージャについてお読みください。

より簡単な例として、次のコードを試してください。

var foo = function () {
    var a = 1;

    return function (b) {
        return a+b;
    }
};

var bar = foo();

bar(1); // 2

bar(1)a = 1関数が作成されたときにスコープ内にあったため、常に2が返されます。あなたの場合、aあなたthatとあなたのハンドラーはクローズド関数です。

http://jsfiddle.net/Fh8d3/

于 2012-12-06T20:31:37.513 に答える
0

thatとの両方が、クロージャーmyPrivateCodeを通じてイベント ハンドラーで使用できます。つまり、別の関数内で宣言するすべての変数と関数は、外側のスコープにアクセスできます。

myPublicCode一方、moduleオブジェクトに明確に割り当てられているため、クロージャーでは使用できません。したがって、それを呼び出す唯一の方法は、を使用することですmodule.myPublicCode()(またはthat.myPublicCode()、あなたが行ったように – しかし、実際には必要thatありませんmodule。 も利用可能です)。

于 2012-12-06T20:37:59.683 に答える