2011-04-22 22 views
3

jQuery.data()でいくつかのテストを行っていますが、特定のデータキーへのローカル参照を作成しようとしています。 "私は願って出力されjQuery.dataキーへのローカル参照の作成

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

:私はそれが原因私はjsFiddleではなく、それをここに掲示半の長いコードを、例を挙げてより良いことだと思う

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

が、 lengthプロパティだけがローカル変数のインクリメントによって影響を受けます:

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

どうすればよいですか?

+0

になりますローカル変数があなたが影響を与えようとしている外部変数と同じ名前を持っているという事実によって、あなたは[可変シャドーイング](http://en.wikipedia.org/wiki/Variable_shadowing)を見ていると思います。 –

+0

これを正しく理解すれば、ローカル変数の合計をtotal_errorsのようなものに変更することをお勧めします。したがって、名前は$ .dataオブジェクトの名前と同じではありませんか?もしそうなら、私は試してみたが、うまくいかなかった:< – Esben

答えて

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')はまだI 5.

+0

Aaah ..ありがとうございます。非常に啓発です! – Esben

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

+0

私は実際に$で回り込んでいます。最近私が取り組んでいるプラグインのために少しデータがあり、私はそれを完全に捨てるつもりだと思う。つまり、利便性以外の主な利点は、アプリケーションの分離された部分(別々のモジュールなど)間でデータを保持する必要がある場合だと思います。特定のモジュール内では、DOM要素自体以外の識別子を持っている限り、独自のストレージメカニズム(オブジェクトの配列など)を使用するだけでは効果がありません。 Cheap hack:配列インデックスを要素のカスタム属性に格納し、要素を指定したo(1)ルックアップ時間を取得します。 –

関連する問題