2011-04-22 63 views
3

我正在做一些測試jQuery.data(),我試圖創建一個特定的數據鍵的本地引用,我希望可以在本地進行更改,並仍然影響「外部」。我認爲這將是更好的例子,由於半長的代碼我張貼上的jsfiddle,而不是在這裏:創建一個本地引用jQuery.data鍵

http://jsfiddle.net/esbenp/p4kt2/22/

我希望輸出是:

{1: {length: 1}, total: 1} 

但只有長度屬性受局部變量遞增的影響:

{1: {length: 1}, total: 0} 

我該怎麼辦?

+0

我相信你看到[variable shadowing](http://en.wikipedia.org/wiki/Variable_shadowing)是由於局部變量與你試圖影響的外部變量具有相同的名稱。 – 2011-04-22 20:25:01

+0

如果我正確理解這一點,你建議我將局部變量total改爲total_errors之類的東西,所以它的名稱與$ .data對象中的不一樣?如果是這樣 - 我試了一下,但沒有奏效:< – Esben 2011-04-22 20:42:26

回答

5

如果存儲在.data()對象(或數組),那麼你實際上存儲參考它,所以如果你這樣做:

var obj = { key: 'value' } 
$(el).data('obj') = obj; 
obj.key = 'new value'; 

$(el).data('obj').key也將new value,因爲它是相同的對象

然而,如果所存儲的值是一個普通類型,而不是(例如一個數或字符串),一個複製將存儲:

var n = 5; 
$(el).data('obj') = n; 
n++; 

$(el).data('obj')仍將5.

+0

Aaah ..謝謝。非常有啓發性! – Esben 2011-04-22 20:55:46

2

我不會說謊 - 代碼是令人難以置信的混淆。是否有一個原因,你需要使用所有這些自動執行功能?看起來(至少對於這個非專業人士),你可以用更直接的方式編寫這個代碼來實現你的目標。

無論如何,我不確定這是你正在尋找的答案,但我只是停止AddError裏面的調試器,所以我可以理解它的範圍和可用的東西。因此,所有你需要做的,使其返回你想要的輸出是這樣的:

http://jsfiddle.net/qN7wF/2/

functions = { 
    AddError: function() { 
     console.log(total); 
     $(container).data('errors').total++; 
     errors.length++; 
    }, 

但考慮上下文...我猜必須有更多在作怪。

+0

是的,對於這樣一個簡單的目標來說是相當混亂的。這是因爲我在具有更多代碼的應用程序中這樣做,所以我只是刪除了所有不相關的代碼。自我執行的功能,是讓它工作的唯一方法:)如果你有一個更簡單的解決方案來添加1:{length:0}鍵並創建本地變量,我很樂意聽到它。我知道我可以用$(elem).data來做到這一點,但我想用$ .data(elem)來做到,性能差異應該很大(或者我已經閱讀:)) – Esben 2011-04-22 20:53:30

+0

我實際上一直在用'$來解決問題。數據「有點晚了,因爲我正在開發一個插件,我認爲我會完全拋棄它。也就是說,我認爲主要好處(便利除外)是當您需要在應用程序的隔離部分(例如獨立模塊)之間持久保存數據時。在一個給定的模塊中,只要使用自己的存儲機制(例如對象數組),就不會看到任何好處,只要您具有DOM元素本身以外的其他標識符即可。便宜的hack:將數組索引存儲在o(1)查找時間元素的自定義屬性中,給定一個元素。 – 2011-04-22 21:06:43