2

まず第一に、次のように JavaScript プログラムで偽の名前空間を使用しようとしています。

// Ish.Com namespace declaration
var Ish = Ish || {};
Ish.Com = Ish.Com || {};

// begin Ish.Com.View namespace
Ish.Com.View = new function() {
  var privateVariable;

  this.publicFunction = function() {
    this.publicFunction2()
  };

  this.publicFunction2 = function() { ... };
};

私は他の関数を呼び出すことに夢中ではありませんthisが、最近までは機能していました。ただし、いくつかの要素にイベント リスナーを追加したところ、それらthisはターゲット オブジェクトとして解釈されます。

thisリスナー内の関数を呼び出す代わりに、完全な名前空間を使用できることはわかっていますIsh.Com.View.publicFunction2()が ( )、リスナーは、ある関数を呼び出し、その関数が別の関数を呼び出したり、別の関数を呼び出したりすることがよくあります。ほとんどすべての関数呼び出しで名前空間全体を使用する必要があります。

名前空間をイベント リスナーとうまく連携させるにはどうすればよいですか? 名前空間を使用するのは面倒なので、名前空間を実装するより良い方法にも興味がありますthis.publicFunction2()

私はベスト プラクティスに非常に興味があり、JavaScript で適切に設計されたアプリケーションを作成する方法を学びます。ただし、フレームワークは、JavaScript をより完全に理解するまで問題外です。

4

3 に答える 3

4

今朝も同じようにすべての質問に答えているようです :-)

「.bind()」を使用できます。

   var eventHandler = yourObject.someFunction.bind(yourObject);

thisこれにより、「eventHandler」が何かによって呼び出されるたびに「yourObject」を参照することが保証されます。

「bind()」関数は、新しいブラウザの Function.prototype オブジェクトにあります。Mozilla ドキュメントには、古いブラウザにパッチを適用するために使用できる「bind()」の確実な実装が含まれています。

this「bind()」が行うことは、規定どおりにバインドされるように明示的に手配する新しい関数を返すことです。必要に応じて、渡される引数を渡すこともできます。「bind()」を使用する代わりに、関数呼び出しを独自の無名関数でラップすることもできます。

  var eventHandler = function() { yourObject.someFunction(); };
于 2011-05-31T14:36:48.407 に答える
0

これは、可変コンテキストとクロージャが原因です。「this」は常に現在のオブジェクトを指します。イベント関数はオブジェクト自体であり、「this」はそのオブジェクトを参照します。親オブジェクトを参照する必要がある場合は、前述のようにbindを使用するか、親の「this」を変数に設定して、イベント関数で使用できます。

// Ish.Com namespace declaration
var Ish = Ish || {};
Ish.Com = Ish.Com || {};
// begin Ish.Com.View namespace
Ish.Com.View = new function() {
  var privateVariable, thisObj=this;
  this.publicFunction = function() {
    thisObj.publicFunction2()
  };
  this.publicFunction2 = function() { ... };
};
于 2011-05-31T15:02:00.260 に答える
0

あなたの質問を完全に理解したかどうかわかりません。これはあなたのニーズに合いますか?

var obj = new function() {
    var scope = this;

    this.fun1 = function() {
        return scope.fun2();
    }

    this.fun2 = function() {
        //do sth
    }
};
于 2011-05-31T15:00:18.017 に答える