2

まず第一に、これがこのライブラリを使用する正しい方法かどうかはわかりません。モジュールで複数の関数/静的メソッドを定義し、それらをモジュールのスコープ内で使用したいと考えています。例えば:

define({
        foo: function() {
            return "Hello";
        },

        bar: function() {
            alert( this.foo() );
        }
});

Main.js

require( ['foobar'], function( foobar) {

        foobar.bar(); // works
        $('body').click( foobar.bar ); // crash - Object #<HTMLBodyElement> has no method 'foo' 

});

bar()イベントによってトリガーされた場合、このコードは機能しません。これは、明らかthisにそのスコープで何かが異なることを意味するためです。define()定義されたオブジェクトを参照し、コード内からメソッドと属性にアクセスできるようにするグローバル変数はありますか?

4

3 に答える 3

4

編集: 詳細についてthisは、以下を参照してください。

関数を使用して内部スコープを持つことができます。モジュールを次のように宣言することができます。

define((function () { var self = {   // this line is changed
        foo: function() {
            return "Hello";
        },

        bar: function() {
            alert( self.foo() );
        }
}; return self; }()));    // and this

これはひどく見えます、私は認めます。ポイントは、返されたオブジェクトへの参照を格納し、これを使用して を呼び出すことfooです。このようにしたいかどうかはわかりませんが...でもうまくいきます。


this注: この部分はJSでの処理に関するものです。この質問にこれがもはや関係ない理由のコメントを参照してください。

問題は、モジュールではなく、実際には にmain.jsあります。問題は、JS の処理方法thisです。これは、他のほとんどの言語と同じではありません。thisin JS は、関数が定義されたコンテキストではなく、関数が呼び出されたコンテキストです。この機能がなくても、他のオブジェクトに対して機能することができます。apply

あなたの場合bind barfoobarオブジェクトにしたいので、thisinbarが正しいオブジェクトです。そのために関数bindを使用します。指定したオブジェクトに設定されたコンテキストで新しい関数を作成します。例:

function doubleMe () { return this * 2; }

次のようにして、この関数を呼び出すことができます。

doubleMe.apply(5) // returns 10

これを行うこともできます:

var giveMeTen = doubleMe.bind(5);

NowgiveMeTenは、実行された場合に戻る関数10です。このトピックについてもっと読むことをお勧めしますthis


あなたのコードに関して、私は書きます:

require( ['foobar'], function( foobar) {

        foobar.bar();
        $('body').click( foobar.bar.bind(foobar));
});

jQuery は、ハンドラーthisでクリックされた要素に設定されることに注意してください。click()

于 2013-08-29T19:08:34.577 に答える
2

あなたがここで何を達成しようとしているのかわからない場合、おそらくあなたがやろうとしていることとしてより多くの文脈があれば、より正確なカウンセリングを提供できます.

それにもかかわらず、requireJS(主にクラス)でモジュールを作成する通常の方法は次のとおりです

if ( typeof define === "function" && define.amd ) {
    define( "module", function () {
        var MyModule = function(){
            this.foo = function(){
                return "Hello!";
            };
            this.bar = function(){
                return this.foo();
            };
         }

         return MyModule;
     });
}

そして今使用する:

require("module", function(MyMod){
    var a = new MyMod();
    console.log(a.bar());
} 

お役に立てれば。(おそらく、クローズド スコープを使用して、これからシングルトンを作成する方法を推測できます)

于 2013-08-29T18:20:09.410 に答える
2

これは、定義する関数を渡すことで実行できます (この関数は定義関数と呼ばれます)。定義関数内:

  1. モジュール内で使用する関数を定義します。
  2. モジュールで公開したい機能を備えたオブジェクトを定義関数が返すようにします。ここで、返されるオブジェクトで、前の手順で定義された関数を呼び出すことができます。

    define(function() {
        function foo() {
            return "Hello";
        };
    
        return {
            bar: function() {
                alert(foo());
            }
        }
    });
    
于 2014-12-07T10:35:39.160 に答える