2017-06-24 4 views
0

に私はそれは、要求がsが言うと、それはいくつかのデータを取得させます、私はこのコードは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); 

    } 
}; 

を持っている、これは例えば、いくつかの状況での動作方法について混乱しています。問題は、私が関数makeRequestobj.loadDataと呼んでいるときにエラーとなることです。 誰かがこれがなぜ起こるのか説明できますか?私がobj.prepareRequest()と呼んでも、loadDataメソッドがobjオブジェクトに攻撃されても、それが期待通りに動作しないのはなぜですか? 私は助けていただければ幸いです。 "この"キーワードは本当に混乱しています。時点

+1

可能な複製を助け[ "この" キーワードの作業を行う方法は?](https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work ) –

+0

どうしたらいいですか? –

+0

関数 "loadData"内で "this"はオブジェクトを参照するのではなく、関数自体を参照します。 JavaScriptの変数スコープを読み込みます – EyeOfTheHawks

答えて

0

あなたはmakeRequestにパラメータとしてごloadData機能を渡されたときだけで所有権を切り替えると思うが... makeRequestは今loadDataで使用されている任意のthisキーワードがありますならば、それはmakeRequestないを参照しているので、loadData を所有していますobj

所有権またはコンテキストを維持する方法は.bind()

loadDataコンテキストがbindを追加するには、prepareRequest機能で

を交換し、良い練習がthisを使用することですので、何であるかthis.someValue何の手掛かりを持っていない使用することですoop目的用

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

希望これはの

+0

つまり、loadDataは、makeRequestのパラメータでもあるため、objオブジェクトに付加されたメソッドでも、makeRequestはjavascriptのオブジェクトである関数なので、loadDataはmakeRequestオブジェクト。これまで私が理解していることです。私はそれが正しいことを願って – Osiris

+0

はい正しいです! – KpTheConstructor