2

これは重複している可能性がありますが、検索方法がわかりませんでした。

どして

var test = test || {};

動作しますが

var test = testing || {};

エラーをスローしますか?定義の時点では、とは両方ともtest未定義testingです。

編集

スローされるエラーは「参照エラー:テストが定義されていません」です。

4

3 に答える 3

3

存在しないという意味で未定義の変数と、値を保持する変数には違いがありますundefined

最初の例では、の右側の式が評価されるときに変数が存在するが、値が。であると宣言testします。var=testundefined

2番目の例では、まったく定義testingしていないため、エラーが発生します。

編集:おそらくそれ以上の説明は害にならないだろうと私は思います。

簡単にするために、JavaScriptエンジンはコードを2回通過します。最初のパスは解析/コンパイルフェーズであり、その後、変数宣言は行われますが、割り当ては行われません。2番目のパスは実際の実行であり、その後、割り当てが発生します。これにより、「可変ホイスト」と呼ばれることが多い効果が得られます。これは、JSエンジンが宣言をスコープの最上位に「ホイスト」するかのように、割り当てを適切に実行します。

このようなコードのポイントに関しては:

var test = test || {};

...基本的には「test真の値ですでに存在しますか?使用する場合は、それ以外の場合は新しい空のオブジェクトに設定します」と言っています。

JSエンジンは、同じ変数が同じスコープ内で複数回宣言されているかどうかを気にしません。基本的に2番目の宣言を無視しますが、2番目の宣言に含まれる割り当ては無視しません。したがって、test他のスクリプトブロックで、おそらく別のJSインクルードファイルで宣言されている場合、問題の行はtestそれ自体に割り当てられます(すべてのオブジェクトが真である場合、真の値があると仮定します)。ただし、他の場所で宣言されていない場合は、現在のvarステートメントの結果としてまだ存在しますがundefined、現在の代入の前にあるため、||演算子は右側のオペランドであるを返します{}

于 2012-11-22T10:54:43.390 に答える
1

varキーワードによるものです。変数が宣言されているため、値は未定義ですが、変数も存在します。次に||行うことは、真実性をチェックすることであり、オブジェクトが未定義であることが判明すると、操作する新しいオブジェクトを提供します。

後者はまったく同じことを行いますが、「1行」で実行しているためtesting、評価時にオブジェクトが定義されないため、例外がスローされます。

于 2012-11-22T10:53:04.710 に答える
1
var test = test || {};

ここでは、されていますが、testされてdeclaredいませんdefined

しかし、で、

var test = testing || {};

何の参照もありtestingません、そしてあなたはまだその価値を割り当てようとしています。

最初のケースに対応するコードは次のようになります。

var testing;  // See testing is still undefined
var test = testing || {};
于 2012-11-22T10:56:40.440 に答える