6

以下のコードをグローバル コンテキストで実行します。

var x = 1;
y = 1
delete x //false
delete y //true

xとの両方yがグローバル オブジェクトのプロパティです。javascriptがそれらをある程度区別する必要があるのはなぜですか?


ES5 標準delete演算子オブジェクトの内部メソッド[[delete]]に準拠したルーチンに従うのは簡単です。

表現されたより明確な質問は、なぜ彼らが異なる[[configurable]]属性を採用するのかということです。

4

1 に答える 1

5

kangaxによるこの関連する質問の 2 番目の回答を見てください。

var x = 1 は、現在のスコープ (別名実行コンテキスト) で変数 x を宣言します。宣言が関数内にある場合 - ローカル変数が宣言されています。グローバル スコープ内にある場合 - グローバル変数が宣言されます。

一方、x = 1 は単なるプロパティの割り当てです。まず、スコープ チェーンに対して x を解決しようとします。そのスコープ チェーンのどこかにある場合は、割り当てを実行します。x が見つからない場合にのみ、グローバル オブジェクト (スコープ チェーンの最上位オブジェクト) に x プロパティを作成します。

ここで、グローバル変数を宣言していないことに注意してください。グローバル プロパティを作成します。

2 つの違いは微妙で、変数宣言もプロパティを作成し (Variable Object でのみ)、Javascript のすべてのプロパティ (まあ、ECMAScript) には、それらのプロパティを説明する特定のフラグ (ReadOnly、DontEnum、および DontDelete) があることを理解していない限り、混乱を招く可能性があります。 .

変数宣言は DontDelete フラグを使用してプロパティを作成するため、var x = 1 と x = 1 (グローバル スコープで実行した場合) の違いは、前者 (変数宣言) は DontDelete'able プロパティを作成し、後者は作成しないことです。結果として、この暗黙の代入によって作成されたプロパティはグローバル オブジェクトから削除できますが、以前のもの (変数宣言によって作成されたもの) は削除できません。

于 2013-07-03T08:04:53.613 に答える