2

おっと-間違って投稿されました

みなさん、お詫び申し上げます。私のコードを読み間違え、その振る舞いを誤解しました。


ソースコード

変数shoeが2回初期化されるページがあります。1回index.htmlはインクルードで、もう1回はインクルードされていscript.jsます。

index.html

<script src='script.js'></script>
<script>
   var shoe = { color: 'pink' };
</script>

script.js

var shoe = { size: 13 };

結果の値

chrome、結果の値shoe

>> shoe = { color: 'pink', size: 13 }

2つの宣言を連結したように見えますchrome-これは非常にクールで非常に礼儀正しいです。

これは標準的な動作ですか?ブラウザ間でこれを信頼できますか?


ランタイムの例

http://www.trailsandtribulations.net/tech/barebone.htmlを参照してください

ソースは次のとおりです。

(私は一時的にjavascriptをバンドル解除しました)

複数回宣言する変数はstate

4

4 に答える 4

3

その動作は標準ではなく、信頼すべきではありません。次のようなことをする必要があります。

var shoe = shoe || {};
shoe.color = 'pink';

var shoe = shoe || {};
shoe.size = 13;

基本的に、この構文は、定義されている場合はに割り当てshoeられshoe、そうでない場合は新しいオブジェクトを作成します。shoeこれにより、存在する場合の以前の状態が常に保持され、安全に変更できるようになります。この構文を使用すると、変数を1回または10回初期化しようとしても問題ありません。それは常に正しく、同じように動作します。

于 2012-11-26T03:15:04.343 に答える
2

chomeがそれらを単一のオブジェクトにすることを知っていたのは非常にクールかもしれませんが、将来はそうしないことをお勧めします。

より良い方法は、次のようなオブジェクトを作成することです。

var shoe = {
  size: 13,
  color: 'pink'
};

異なる色の靴のオブジェクトを作成したい場合は、次のようなことを行うことができます

function shoe(attributes) {
   this.size = attributes.size;
   this.color = attributes.color;
}

これで、次のように新しい靴オブジェクトを作成できます。

var my_shoe = new shoe({
  size: 10.5,
  color: 'white'
});

これで、my_shoeの色を次のように取得できます。

my_shoe.color; // returns 'white'

あなたがやろうとしていることを解釈するためにブラウザに頼ることは決して良い考えではありません。

于 2012-11-26T03:13:25.513 に答える
1

あなたの質問の状況は実際にはまったく発生していません(少なくともバージョン23のchromeでは)。これが事実であることをお見せしようと思います。

まず、「varstate」が「session.js」で次の属性を使用して宣言されます。

var state = {
  inited: false,
  sid: null,
  hash: null,
  status: null,
  usr: {},
  domain: window.location.hostname.split('.').splice(-2).join('.')
};

次に、HTMLの先頭に、「var state」を再度宣言するスクリプトブロックがあります。これにより、元のオブジェクトが上書きされます。

var state = {
  sources: [
    '/tech/layout.jade',
    '/scripts/bladette.js',
    '/scripts/utils.js',
    '/scripts/modal.js',
    '/scripts/session.js',
    '/scripts/outliner.js',
    '/scripts/restful.js',
    '/scripts/params.js',
    '/scripts/menu.js',
    '/scripts/checks.js',
    '/scripts/notes.js',
    '/scripts/expand.js',
    '/scripts/store.js',
    '/scripts/storage.js' ],
  initFuncs: [ session.init ]
}

この後、状態オブジェクトに値を割り当てるコード内の多くの場所があります。これが、両方のオブジェクトがマージされたように見え始める理由です。「state.inited」が存在しないということはありませんでしたが、「session.js」スクリプトでこのプロパティを使用して宣言されています。オブジェクトは、他の関数を介してこれらのプロパティを取得しています。私のアドバイスは、さまざまなステージ/イベントでJSをデバッグし、「state」オブジェクトをチェックして、これらの値が追加される場所を特定することです。'state.foo=1;'であることを思い出してください。'state'オブジェクトは、宣言されているかどうかに関係なく、'foo'のプロパティを与えます。

お役に立てば幸いです。

于 2012-11-26T04:05:37.423 に答える
-3

varキーワードは、ページ内で変数をグローバルにすることが知られています。これはChromeの「優れた」機能ですが、回避するには十分に奇妙です。このような種類のブラウザー依存関係を回避するために、OOPの概念を使用してコードを記述してください。

于 2012-11-26T03:16:33.337 に答える