2017-02-16 7 views
3

私の目標は、関数のテーブルから関数を呼び出して(つまり間接的に)コマンド処理を一般化することです。残念なことに、thisは、undefinedと呼ばれます。js - 'this'はメソッド 'indirectly'を呼び出すときには定義されていません

function Server() { 
    this.sessions = {}; 

    server = this; 
    this.handlers = { 
     "dummy" : server.dummyCommandHandler, 
    }; 
} 

Server.prototype.dummyCommandHandler = function() { 
    print (this.sessions); 
} 

Server.prototype.run = function (command) { 
    print (this.sessions); // [Object object] 
    this.handlers[command.name](); // prints 'undefined' 
    this.dummyCommandHandler(); // prints '[Object object]' 
} 

s = new Server(); 
s.run({ "name": "dummy" }); 

これではJavaScriptを使用して、私の初めてです、と私は私がダウンしてスコープを持っていたが、どうやらそれはそうよりも複雑であると思いました。 Aliasing Serverのthisserverという変数を使用しても問題が解決しませんでした(おそらくthishandlersオブジェクト内で手を変えたと思いました)。関数が間接的に呼び出されたときのthisの有効範囲は何ですか?

+0

私は〜 'サーバー= this'悪い、' VARサーバ= this'良い – Phil

+1

'this.handlers [command.name] .bind(これを参照することができます最初の問題)(); ' – hlfrmn

+0

あなたのテスト環境は何ですか?私はこれを私のブラウザのコンソールにコピーして貼り付けました。予想どおりに動作していたようですね。 –

答えて

4

thisのデフォルトの動作は、 です。これは、 (以下を参照)が呼び出された時点の関数スコープを参照しています。 thisの値をbindMDN)または矢印関数の構文を使用して強制することができます。この関数の構文は、関数を定義した場所に字句を付けてthisになります。これは私がするだろうな変化である:

"dummy" : server.dummyCommandHandler.bind(this),

+1

"* this ...は呼び出された時点で関数スコープを参照しています*"は間違っています。関数の* this *はスコープとは無関係で、呼び出しや* bind *の使用によって設定されます(または矢印関数には字句的には使用されますが、OPの一部ではありません)。 [* MDN:this *](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this)を参照してください。 – RobG

+0

@RobGあなたが正しいと分かりました。 –

+0

@BihnKim '関数バインドが見つかりません'。残念ながら、Rhino JSではこれがサポートされていないようです。 – MzyBwy

関連する問題