2016-12-28 7 views
0

私はページコントローラPageのようなものを持っていますが、モデルTimを使用し、Pageコントローラからコールバックします。Javascript: 'this'を関数パラメータとして渡した場合、オブジェクトフィールドは未定義です

ここで何が起こっているのか教えてください。

のコードは以下のようになります。それはundefinedない場合であるので、

//the model: 
var Tim = function(){}; 
Tim.prototype.setDuration = function (duration) { 
    this._duration = duration; 
}; 
Tim.prototype.count = function(doSomething) { 
    doSomething(this) 
} 

//the Page controller: 
var Page = function(tim){ 
    this.tim = tim; // initialisation of this.tim 
}; 
Page.prototype.init = function() { 
    this.tim.count(this.pollStatus); 
}; 
Page.prototype.pollStatus = function(tim) { 
    this.tim = tim; // I still have to assign this.tim for the second time 
    $.ajax({ 
      url: 'http://end/point', 
      type: "GET", 
      success: function (data) { 
       this.tim.setDuration(data.duration); 
      }.bind(this) 
    }); 
} 
$(document).ready(function() { 
    var tim = new Tim(); 
    var page = new Page(tim); 
    page.init(); 
}) 

私は、this.tim 2回を割り当てる必要があります。

+0

はどこ 'tim'が宣言されていますか? –

+0

timとは何ですか?「プリント機能」の結果は何ですか? –

+0

'tim'を共有するべきです。 – baao

答えて

0

あなたはdoSomethingのコンテキストがグローバルであり、内部のthiswindowあるdoSomething(this)

Tim.prototype.count = function(doSomething) { 
    doSomething(this) 
} 

を呼び出します。

あなたはbindが何であるかを知っている、それを使用する:

Page.prototype.init = function() { 
    this.tim.count(this.pollStatus.bind(this)); 
}; 

Page.prototype.pollStatus = function(tim) { 
    //this.tim = tim; now the code works without this assignment 
    ... 
+0

はい!ありがとうございました :) – nibsa

関連する問題