2016-04-22 12 views
0
var Test = (function() { 
    return { 
     someValue: 69, 
     staticMethod: function(){ 
      return this.someValue; 
     } 
    } 
}()); 

console.log(Test.staticMethod()); 

var doIt = Test.staticMethod 
console.log(doIt()) 

出力:期待静的メソッドに変数セットを呼び出すときに、これは未定義である

69 
undefined 

69 
69 

がなぜ2回目の呼び出しのコンテキストでthis存在しません。 ?

デモ:

function(){ 
    return this.someValue; 
} 

this

は基本的にこの呼び出しの場合 . 前のオブジェクトである:同じ機能 staticMethodから http://jsbin.com/kidefoniko/edit?js,console

+0

オブジェクトがコンテキストなしで呼び出されるためです。この関数の値は、実行コンテキストに依存します。 – adeneo

+0

正しい方法は 'doIt.call(Test)'ですか?それがテストであることを知らないとどうなりますか?とにかくそのコンテキストを見つけるためにはありますか? – LearningJrDev

+0

実際には、コンテキストはあなたが設定したものであり、あらかじめ定義されていません。 'Test.staticMethod()'を実行すると、コンテキストを 'Test'に設定します.2番目の例では、関数への参照を作成し、コンテキストなしで呼び出すので、' call'、 'apply'代わりにコンテキストを設定するために 'bind'を使います。 – adeneo

答えて

0

doItの参照はありません、それはTest

あるTest.staticMethod()しかしここに:doIt().がありません、ドットの前にはオブジェクトがありません。 この場合、グローバルオブジェクトにはthisが割り当てられます(厳密モードではない場合)。グローバルオブジェクト(ブラウザのwindow)にはsomeValueという名前のプロパティがないため、undefinedがログアウトしています。

関連する問題