これは重複している可能性がありますが、検索方法がわかりませんでした。
どして
var test = test || {};
動作しますが
var test = testing || {};
エラーをスローしますか?定義の時点では、とは両方ともtest
未定義testing
です。
編集
スローされるエラーは「参照エラー:テストが定義されていません」です。
これは重複している可能性がありますが、検索方法がわかりませんでした。
どして
var test = test || {};
動作しますが
var test = testing || {};
エラーをスローしますか?定義の時点では、とは両方ともtest
未定義testing
です。
編集
スローされるエラーは「参照エラー:テストが定義されていません」です。
存在しないという意味で未定義の変数と、値を保持する変数には違いがありますundefined
。
最初の例では、の右側の式が評価されるときに変数が存在するが、値が。であると宣言test
します。var
=
test
undefined
2番目の例では、まったく定義testing
していないため、エラーが発生します。
編集:おそらくそれ以上の説明は害にならないだろうと私は思います。
簡単にするために、JavaScriptエンジンはコードを2回通過します。最初のパスは解析/コンパイルフェーズであり、その後、変数宣言は行われますが、割り当ては行われません。2番目のパスは実際の実行であり、その後、割り当てが発生します。これにより、「可変ホイスト」と呼ばれることが多い効果が得られます。これは、JSエンジンが宣言をスコープの最上位に「ホイスト」するかのように、割り当てを適切に実行します。
このようなコードのポイントに関しては:
var test = test || {};
...基本的には「test
真の値ですでに存在しますか?使用する場合は、それ以外の場合は新しい空のオブジェクトに設定します」と言っています。
JSエンジンは、同じ変数が同じスコープ内で複数回宣言されているかどうかを気にしません。基本的に2番目の宣言を無視しますが、2番目の宣言に含まれる割り当ては無視しません。したがって、test
他のスクリプトブロックで、おそらく別のJSインクルードファイルで宣言されている場合、問題の行はtest
それ自体に割り当てられます(すべてのオブジェクトが真である場合、真の値があると仮定します)。ただし、他の場所で宣言されていない場合は、現在のvar
ステートメントの結果としてまだ存在しますがundefined
、現在の代入の前にあるため、||
演算子は右側のオペランドであるを返します{}
。
var
キーワードによるものです。変数が宣言されているため、値は未定義ですが、変数も存在します。次に||
行うことは、真実性をチェックすることであり、オブジェクトが未定義であることが判明すると、操作する新しいオブジェクトを提供します。
後者はまったく同じことを行いますが、「1行」で実行しているためtesting
、評価時にオブジェクトが定義されないため、例外がスローされます。
var test = test || {};
ここでは、されていますが、test
されてdeclared
いませんdefined
しかし、で、
var test = testing || {};
何の参照もありtesting
ません、そしてあなたはまだその価値を割り当てようとしています。
最初のケースに対応するコードは次のようになります。
var testing; // See testing is still undefined
var test = testing || {};