2013-07-03 5 views
6

グローバルコンテキストで以下のコードを実行しなぜJavaScriptは削除時に宣言の有無を区別しますか?

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

両方xyはグローバルオブジェクトのプロパティです。なぜJavaScriptはそれらをある程度区別しなければならないのですか?


それはES5標準the delete operatorthe object internal method[[delete]]にルーチンaccoringに従うことは簡単です。

より明確な質問はなぜ異なる[[configurable]]属性を採用していますか?

+0

@FelixKlingこんにちは、もう一度見てね!しかし、なぜ[[configurable]]属性が異なるのか分かりません。あなたは標準を読んでいるが、それについての証拠は見つけられなかったことを知っている。そのような決定は? – yuan

+0

さて、私はその決定をしなかったことを伝えることはできません:) ECMAScript標準で作業している人に連絡してください。 –

答えて

5

this related questionの2番目の回答を参照してください。kangax

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

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

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

微妙であり、あなたは変数の宣言も(のみ 上の変数オブジェクト)のプロパティを作成することを理解し ない限り、混乱するかもしれない2間とJavascriptですべてのプロパティ(まあ、 ECMAScriptのは)自分を記述する特定のフラグを持っていることの違いプロパティ - ReadOnly、DontEnumおよびDontDelete。変数宣言 - - DontDelete'able プロパティを作成し、後者

(グローバルスコープで実行された場合)、変数宣言はDontDeleteフラグ、VARはx = 1であり、x = 1の間 差とプロパティを作成するので は前者のことです1つはありません。結果として、この暗黙的な割り当てによって で作成されたプロパティは、グローバル オブジェクトから削除され、元のもの(変数宣言によって作成されたもの: )を削除することはできません。

+0

こちらもここに記載されています。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete – elclanrs

関連する問題