2017-02-08 12 views
1

ランダムな関数を実行したい。Typescript:varのメソッドは別のメソッドを呼び出せませんか?

module A { 

    ... 

    export function foo(): number { 

     let b = new B(); 

     let possibleFunctions = [ 
      b.possibleFunction1, 
      b.possibleFunction2 
     ]; 
     let index = Math.floor(Math.random() * 2); 
     possibleFunctions[index](_var_); 
    } 

    class B { 

     public usefulFunction() { 
      console.log("bbbb"); 
      ... 
     } 

     public possibleFunction1() { 
      ... 
      console.log("aaaa"); 
      this.usefulFunction(); // <-- IS NOT CALLED 
      console.log("cccc"); 
     } 

     public possibleFunction2() { 
      ... 
     } 

    } 

} 

出力のみaaaaのようだと機能usefulFuncitonが(それがエラーになります)と呼ばれることはありません:私のコードは次のようになります。

私は

possibleFunction1(_var_); 

すべてが問題なく動作によって

possibleFunctions[index](_var_); 

を交換する場合。

だから私は知って興味があった:

1.は正しい私の観測はありますか?

なぜそうですか?関数は深くコピーされているのでしょうか?

3,正しい方法はありますか?

ありがとうございました!

+0

「_var_」はどこにも定義されておらず、関数呼び出しでパラメータを渡すのはなぜですか?関数はパラメータを受け付けません。 – Ced

答えて

3

あなたの問題は、javascriptのthisというキーワードの奇妙さに起因しています。他の共通言語とは異なる動作をします。ファンクションをどのように呼び出すかに応じて、異なるオブジェクト(this)を取得するだけです。この問題を克服する1つの方法は、このような関数を呼び出している:

possibleFunctions[index].apply(b, argsArray); 

applyの最初のパラメータは、thisとして利用できるようになります対象である第二であり、あなたの関数の引数の配列。


@Cedは、これを修正する機能をbindにすることをお勧めします。

let possibleFunctions = [ 
     b.possibleFunction1.bind(b), 
     b.possibleFunction2.bind(b) 
    ]; 

これは関係なく、関数を呼び出す方法のbするthisを強制します。

+1

もう1つのアプローチは、使用することです。let possibleFunctions = [ b.possibleFunction1.bind(b)、 b.possibleFunction2.bind(b) ];私の意見では少し真っ直ぐです。 – Ced

+0

ああわかった。説明ありがとう! クラスにモジュールがなく、別のファイルからインポートされた場合はどうなりますか?それはうまくいくのだろうか? – AAAAAAAAAA

関連する問題