2017-06-24 25 views
0

我感到困惑的這一行爲在某些情況下,例如方式我有這樣的代碼關於這個在JavaScript

var makeRequest=function(url,callback){ 

    var data=10; 

    callback(data); 
}; 

var obj = { 
    someValue: 20, 
    loadData: function(data){ 
    var sum = this.someValue + data; 
    alert(sum); 
    }, 
    prepareRequest:function(){ 
    var url="http://someurl.com"; 

    makeRequest(url,obj.loadData); 

    } 
}; 

它發出請求令s說,它得到了一些數據。問題是,當我將makeRequestobj.loadData作爲參數調用時,它會給出錯誤。 有人可以解釋爲什麼會發生這種情況嗎?爲什麼當我呼叫obj.prepareRequest()甚至是loadData方法被攻擊到obj對象時,它不會表現出預期的方式? 我將不勝感激任何幫助。 「這個」關鍵字確實令人困惑。

+1

的[如何進行 「this」 關鍵字的工作?](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work可能的複製) –

+0

你得到的錯誤是什麼? –

+0

在你的函數「loadData」中,「this」不是指你的對象,而是函數本身。閱讀JavaScript中的變量範圍 – EyeOfTheHawks

回答

0

在點,當你通過你的loadData函數作爲參數傳遞到makeRequest只是覺得開關所有權... makeRequest現在擁有loadData 所以如果有在loadData正在使用的任何this關鍵字則指makeRequestobj

保持所有權或上下文的方式是使用.bind()

loadData沒有線索是什麼this.someValue因爲上下文改爲

在你prepareRequest功能添加bind和良好做法是使用this用於oop目的

示例

makeRequest(url,this.loadData.bind(this)); 

希望這有助於

+0

所以你的意思是,即使loadData是一個附加到obj對象的方法,因爲它也是makeRequest的一個參數,並且makeRequest是一個函數,它是javascript中的對象,現在loadData被附加到makeRequest對象。是我迄今爲止所瞭解的。我希望我知道對了 – Osiris

+0

是的,這是正確的! – KpTheConstructor