2012-05-03 31 views
3
$.each(["foo","bar"],function(){console.debug(this);}); 

將字符串類型的「foo」和「bar」轉換爲字符串對象中的等價對象。

而...

$.each(["foo","bar"],function(i,e){console.debug(e);}); 

將保持在原來的字符串類型 「foo」 和 「酒吧」。

我想知道爲什麼$ .each會進行轉換?而且,更重要的一點是,如果這種轉換不會發生 - 讓字符串保持原樣,無論它們是字符串類型還是字符串對象?

回答

1

這裏不要怪jQuery:這是一個JavaScript的怪癖。如ECMAScript第三版第10.4.3節中定義的那樣,當您調用一個函數時,將操縱this僞參數:值得注意的是,空值被轉換爲全局對象(window),並且原始值是自動裝箱的:

3)否則如果Type(thisArg)不是Object,則將ThisBinding設置爲ToObject(thisArg)。

參數不會以同樣的方式受到損壞,這就是每個()的第二個參數更可靠的原因。

JavaScript做這件事沒有什麼特別的理由,它只是Netscape當天所做的一件瘋狂事情,然後必須在ECMAScript中進行標準化。在第五版的嚴格模式下,這種好奇的行爲消失了。

2

按照jQuery documentation

(該值也可以通過this關鍵字訪問,但是 的JavaScript將始終包裹這個值作爲一個對象,即使它是 一個簡單的字符串或數值)

這表明它是Javascript,而不是jQuery正在進行轉換。

在使用回調函數中的值的情況下,jQuery自己傳遞該值,因此它可以保留其類型。

+1

我相信導致這個問題的JavaScript行爲是[call()函數](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call),它自動包含原語。 – 2012-05-03 14:26:45