2013-04-22 56 views
1

我需要一些關於javascript調用元數據的說明。下面提供的代碼具有SenderAsParameterFunc和NoExplicitParametersFunc,它們是從AnotherFunction的每個循環中調用的。javascript closure:隱式參數,調用者

var Obj = function(){ 

Obj.SenderAsParameterFunc = function(sender, param1, param2){ 
// log $(sender).id; 
} 

Obj.NoExplicitParametersFunc = function(){ 

// EXTRACT DEFAULT SENDER/CALLEE 
// I see in console Obj.NoExplicitParametersFunc.caller.arguments >> SEE REF1 
} 

Obj.NoExplicitParametersFuncWithExtraArgs = function(this, par1, par2){ 
// 'this' from each loop? 
} 

Obj.AnotherFunc = function(){ 

    var X = $('myselect'); 

    var par1 = 1; 
    var par2 = 'bla'; 
    $.each(X.find("option"), function() { 
       Obj.SenderAsParameterFunc(this, par1, par2); 
       // 'this' here references current object from 'each' loop 
      }); 

    $.each(X.find("option"), Obj.NoExplicitParametersFunc); 
    // must be equvalent to first var, 
    // but to extract 'inner' this we have to do more magic in NoExplicitParametersFunc... 

    var par1 = 1; 
    var par2 = 'bla'; 
    $.each(X.find("option"), Obj.NoExplicitParametersFuncWithExtraArgs); 
    } 

} 

那麼應該怎麼寫NoExplicitParametersFunc作爲在SenderAsParameterFunc與$(本)完成以訪問每個選項?

==========

OK,總結我學到的東西: 如果一個函數不用參數

$.each(X.find("option"), Obj.NoExplicitParametersFunc); 

然後 '這' 默認情況下,通過並且可以在一個函數內訪問。

如果函數參數

$.each(X.find("option"), function() { Obj.SenderAsParameterFunc(this, par1, par2); }); 

然後「這個」必須包含作爲參數(第一?)是函數內訪問。

=============

REF1:

b.Event 
altKey: undefined 
attrChange: undefined 
attrName: undefined 
bubbles: true 
cancelable: false 
ctrlKey: undefined 
currentTarget: input#inputId 
data: undefined 
delegateTarget: input#inputId 
eventPhase: 2 
handleObj: Object 
isDefaultPrevented: function ot(){return!1} 
jQuery19105656534675508738: true 
metaKey: false 
originalEvent: Event 
relatedNode: undefined 
relatedTarget: undefined 
shiftKey: undefined 
srcElement: input#inputId 
target: input#inputId 
timeStamp: 1366622725473 
type: "change" 
view: undefined 
which: undefined 
__proto__: Object, 

currentTarget當前,delegateTarget,srcElement,目標相同,但應該怎樣實際使用,最正確的辦法?參考將不勝感激!

謝謝。

+1

'REF1'看起來不像您提供的代碼的結果。它是一個jQuery事件對象。 – 2013-04-22 10:58:11

+1

WTH是'Obj.caller.arguments'應該是? – Bergi 2013-04-22 11:01:34

+0

這是Obj.NoExplicitParametersFunc.caller.arguments,如果它不假設做任何事情,那麼讓我們關注一下什麼可以和將會發生什麼。在console.log(this,i,v)中爲 – 2013-04-22 11:14:39

回答

1
$.each(X.find("option"), function() { 
     Obj.SenderAsParameterFunc(this); 
     // 'this' here references anonymous function, 
     // from which it was called, so 'this' is sender 
}); 

號的匿名功能不受任何此處引用(這是因爲只有在$.each參數訪問)。 $.each回調中的this keyword確實引用了迭代項目。這也不會回答你的問題:

Obj.NoExplicitParametersFunc = function(i, v){ 
    console.log(this, i, v); 
} 

如果函數的參數[和被稱爲匿名函數表達式] then「這個」必須作爲一個參數(?第一個)是內訪問功能。

是的,作爲this是唯一的每個函數調用,你必須一起傳遞其價值 - 就像你不能訪問你的調用函數的局部變量,你無法訪問其this價值。要撥打與特定該值的功能,你可以使用.call

$.each(X.find("option"), function(i, v) { 
    Obj.SenderAsParameterFunc.call(this, i, v, par1, par2); 
}); 
+0

;這個=== Obj – 2013-04-22 11:11:50

+0

如果你用'$ .each(X.find(「option」),Obj.NoExplicitParametersFunc)調用它,那麼不應該這樣做;''你是否讀過我鏈接的this的MDN介紹? – Bergi 2013-04-22 11:14:13

+0

鏈接不明顯,並且不夠細膩,不能精確地解決問題。具有相同名稱的本地參數是否也會發送到該函數? $ .each(X.find(「option」),Obj.NoExplicitParametersFunc); – 2013-04-22 11:23:32

1

TL; DR:在你的情況下,它並不重要,但如果你是在懷疑使用currentTarget


我不是很瞭解你的第一個問題,但是關於第二個問題......

當一個事件通常調度此事件的氣泡,例如這個頁面上:如果用戶點擊一個divimg元素,它將觸發事件,這樣

body - capturing 
div - capturing 
img - at target 
div - bubbling 
body - bubbling 

<body> 
    <div> 
    <img src="foobar.png" /> 
    </div> 
</body> 

所以你可以添加一個聽衆到body,你會發現事件。但爲了讓您知道哪個元素被實際單擊(在這種情況下爲img),它提供了event.target屬性(Internet Explorer上的srcElement)。

delegateTarget是jQuery的添加的屬性,如果你使用事件代表團提供額外的信息。我不知道它到底是什麼,但你可以看看at the documentation

最後currentTarget是你連接的情況下,如果我們增加聽者body這將是body的元素。所以每個事件的論據是

fire body.click with { target: img, currentTarget: body } 
fire div.click with { target: img, currentTarget: div } 
fire img.click with { target: img, currentTarget: img } 
fire div.click with { target: img, currentTarget: div } 
fire body.click with { target: img, currentTarget: body } 

根據你在做什麼,你將需要一個或其他財產。

+0

謝謝,明白了。請檢查更新後的中間的「Summarize」部分..可能我只是對顯而易見的事情感到困惑。謝謝。 – 2013-04-22 13:29:03