hitch()
hitch() 是一個函數,會在給定的上下中執行給定一個執行函數。hitch允許你去控制一個函數如何執行,往往在異步操作中起作用。
我們常常會寫出這樣的代碼:(博主:這個代碼意圖在"click"事件觸發時,執行此時定義的"processEvent"。)
1 require(["dojo/on"], function(on){ 2 var processEvent = function(e){ 3 this.something = "else"; 4 }; 5 on(something, "click", processEvent); 6 });
它錯誤的原因是關於一個無法解析的變量。原因是,像上文這種異步回調函數的應用場景,當代碼正在執行時,上下文會發生變化。執行上下文環境已經不再是最初提供的對象,而指向了外部對象(on的回調函數),為了解決這個問題,你可以使用hitch()去強制processEvent在此時“this”指向的上下文來執行。如下:
1 require(["dojo/on", "dojo/_base/lang"], function(on, lang){ 2 3 var processEvent = function(e){ 4 this.something = "else"; 5 }; 6 7 on(something, "click", lang.hitch(this, processEvent)); 8 9 });
(博主,這種因執行上下文發生變化而導致的問題,可以用hitch()解決,用到this的時候,要注意分析是否會因為執行上下文變化,而出現錯誤了。)
例子:
一個簡單的例子:
1 require(["dojo/_base/lang"], function(lang){ 2 var myObj = { 3 foo: "bar" 4 }; 5 6 var func = lang.hitch(myObj, function(){ 7 console.log(this.foo); 8 }); 9 10 func(); 11 });
上面的得嗎,bar 會被成功打印。所以在執行函數console.log(this.foo)時,this指向的是 myobj。
當調用函數,是給定執行上下文的方法時,可以用方法命傳參的方式,如下:
1 require(["dojo/_base/lang"], function(lang){ 2 var myObj = { 3 foo: "bar", 4 method: function(someArg){ 5 console.log(this.foo); 6 } 7 }; 8 9 var func = lang.hitch(myObj, "method"); 10 11 func(); 12 });
同時,函數執行若需要參數,如下:
1 require(["dojo/_base/lang"], function(lang){ 2 var myObj = { 3 foo: "bar", 4 method: function(someArg){ 5 console.log(someArg + " " + this.foo); 6 } 7 }; 8 9 var func = lang.hitch(myObj, "method", "baz"); 10 11 func(); 12 });
上述代碼會打印: baz bar