4

このコード行を使用する理由を見つけようとしました

var cc = cc = cc || {};

たとえばこの場所の Cocos2D JavaScript ライブラリでは、合理的な理由が見つかりませんでした。設定に関しては、単一の割り当てはデフォルト値で問題ありませんが、二重割り当てですか? その理由を知っている人はいますか?

4

3 に答える 3

2

コードは次と同等です。

var cc;
cc = cc || {};
cc = cc;

これは明らかに間違いです。

アップデート。このトピックについてさらに調査を行ったところ、興味深いことがわかりました。

キーワードを使用するたびに、現在のスコープにまだ存在varない限り、現在のスコープに新しい変数が作成されます。基本的にこのコード:

var cc = 1;
function test() {
    var cc = cc || {};
    return cc;
}
test();

(グローバルスコープ内{}の)の初期値が何であれ、常に生成されます。cc特にこのコード:

var cc = [expression];

次と同等です。

var cc;
cc = [expression];

ただし、現在のスコープに存在しない場合にのみvar cc;新しい変数を作成します。 cc

UPDATE 2.= OPのコードでは両方の符号が実際には同じではないため、どの操作が優先されるかは混乱を招きます。var最初のものは、その前にキーワードがあるため、変数宣言を示します。2つ目は課題です。それが理由です

var x = y = z;

と同等です

var x;
y = z;
x = z;

var(キーワードは にのみ適用されることに注意してくださいx)

x = y = z;

と同等です

y = z;
x = z;

(操作が をy=z返すことzに注意してください。これは実際には問題ではありません(y明らかにそうである可能性があります)が、注目に値します)

結論:左側の変数宣言は常に、右側の評価と左側への右側の割り当ての前に行われます。

于 2013-03-14T09:31:51.513 に答える
1

これは私を悩ませてきたので、プレイしていくつかのテストを行いました。ここに私の発見があります。

2 つの異なる結果を生成する 2 つの異なるスクリプトを示して、なぜ一方を他方よりも優先して使用するのかを説明します。ただし、いずれかを使用する理由はコーダー次第であり、発生させたい効果に基づいています。

例として、空のオブジェクトではなく実際の値を使用することに注意してください。

通常、次の例が使用されていることを期待するかもしれません。

var cc = cc || 1;

これにより、 という名前の新しい変数が作成されcc、既存の (同じスコープ内の) 変数の値、または のデフォルト値が与えられます1。このメソッドは元の変数を変更しませんが、実際には、同じ名前を持つという事実のために後で元を参照できないため、変更されたという効果があるように見えます。

これは、たとえば次のように、さまざまな変数名を使用してテストできます。

var aa;
alert(aa);
var cc = aa || 1;
alert(aa);
alert(cc);

(aa)決して変わらないことがわかります。

次に、問題のコードを見てみましょう。

var cc = cc = cc || 1;

これにより、実際には元の変数が変更され、新しいローカル変数が作成されます。繰り返しますが、変数が同じ名前を持っている間、効果を確認するのは簡単ではありません。ただし、上記と同じ名前の変更を行うと、実際の効果を確認できます。

var aa;
alert(aa);
var cc = aa = aa || 1;
alert(aa);
alert(cc);

() 今回aaは が変更されていることがわかります。

結論として、(同じ変数名で)一方を他方に使用しても実際には何の効果も見られないかもしれませんが、代入の前にどこかでオリジナルを参照できる場合、どのような効果が生じるか興味があります。どちらを使用するかの選択は、実際に効果があります。これを実際に示す何かを見つけることができるかどうかを確認します。

于 2013-03-14T10:24:31.400 に答える