2016-07-20 7 views
1

私はdojoのツールキットのヒッチの機能を理解するのに苦労しています。私は、次のされ、https://dojotoolkit.org/reference-guide/1.10/dojo/_base/lang.htmlでこの例で探しています:dojoのヒッチを理解する

require(["dojo/_base/lang"], function(lang){ 
var myObj = { 
    foo: "bar", 
    method: function(someArg){ 
     console.log(this.foo); 
    } 
    }; 

    var func = lang.hitch(myObj, "method"); 

    func(); 
}); 

は、代わりにmyObj.method(引数)によってその機能を利用することはできませんか?ありがとうございます

答えて

4

代わりにmyObj.method(arg)でその機能を利用することはできませんか?

はい、それはその特定のケースではあるが、それは他のコードへの関数の参照を渡す必要があるためにかなり一般的だし、関数の参照は、それらの中に焼いたいかなる特定のthisを運ぶ(デフォルトでは)しないでください。 thisは、関数の呼び出し方法によって設定されます。

例えば、myObj.methodをイベントハンドラとして使用すると、呼び出されたときにthisはオブジェクトmyObjを参照しません。

hitchは、呼び出されたときにthisが正しく設定された新しい関数を作成することによって修正されている点を修正しました。

ちょっとの日付がついたES5(2009年)は、同じことを行うFunction#bindを紹介しました。しかし、Dojo Toolkitは当初、2005年に作成されたので、このようなユーティリティが含まれていました。ここでは、同じコードではなくFunction#bindを使用します:

var obj = { 
 
    foo: "bar", 
 
    method: function() { 
 
    console.log("this.foo = " + this.foo); 
 
    } 
 
}; 
 
document.getElementById("unbound").addEventListener("click", obj.method, false); 
 
document.getElementById("bound").addEventListener("click", obj.method.bind(obj), false);
<input type="button" id="unbound" value="Unbound"> 
 
<input type="button" id="bound" value="Bound">

+1

はありがとう:

require(["dojo/_base/lang"], function(lang){ var myObj = { foo: "bar", method: function(someArg){ console.log(this.foo); } }; var func = myObj.method.bind(myObj); func(); }); 

ここでは、イベントハンドラでは問題できる方法を示す生きた例です。私は理解し始めていると思う。私はJavaScriptプログラミングの初心者です。 JavaScriptの非同期性のため、このようなユーティリティの必要性はありますか? – Naci

+0

@Naci:いいえ:-)実際、JavaScriptには非同期性がありません。言語であるJavaScriptはほぼ完全に同期しています。それの最初の(そしてこれまでのところのみ)非同期的な側面がES2015で追加されました(約束に対して「then」または「catch」へのコールバックが常に非同期に呼び出されるという保証)。 *(続き)* –

+0

*(続き)*しかし、JSは非同期動作が支配的な環境*ブラウザとNodeJSでよく使われます。しかし、それはこのようなユーティリティの理由ではない、それは単なる平行なものである。例えば、あなたが 'Array#sort'を与えるコールバックは同期ですが、そのためにオブジェクトメソッドを呼びたいのであれば、' bind'が必要です。なぜなら、イベントハンドラ(非同期)。 –

関連する問題