次のスニペットを検討してください (フィドルはこちら):
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
delete
グローバル変数a
とでキーワードの動作が異なるのはなぜb
ですか?
次のスニペットを検討してください (フィドルはこちら):
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
delete
グローバル変数a
とでキーワードの動作が異なるのはなぜb
ですか?
delete 演算子は、オブジェクトからプロパティを削除します。
グローバル変数 ( なしvar
) は、グローバル オブジェクト (通常はwindow
) のプロパティであるため、削除できます。
Avar
はグローバル変数ではありませんが、グローバル オブジェクトのプロパティではなく、外部スコープのローカル変数であるため、delete
削除しません。それらのドキュメントから:
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
MDN によると、delete はプロパティが存在し、削除できない場合にのみ false を返します。それ以外の場合は true を返します。削除後、実際の値をテストしてみてください。a
削除されていないことがわかります。これは、MDN ページにあるように、delete
変数名には影響しないためです。
変数名や関数名には影響しません。
(つまり、グローバル オブジェクトで定義されvar
、グローバル オブジェクトからではありません)
次のページの例を見てみましょう。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
違いは、宣言された変数はグローバル オブジェクトの構成不可能なプロパティであり、宣言されていない変数は構成可能であることです。
var a;
--> を使用しているため、これは宣言された変数であるため、var
構成できません。
a = 6;
--> を使用していないため、これは宣言されていない変数であり、var
構成可能です。
上記の両方の構文a
は、グローバル オブジェクトのプロパティとして添付された名前の var で終了し (window
通常)、プロパティには次の属性があります。
これはecmascript5 オブジェクトとプロパティから抽出されたものであり、お読みのとおりconfigurable
、問題の変数の属性は、変数を削除できるかどうかに影響します。
「var a」は、現在のブロックの外のどこからでもアクセスできないことを意味します。したがって、それを削除することはUNDECLARE (未定義と同じではない) を意味するため、同じブロックに「var a」を再度書き込むことができます (エラー)。
許可される用途 (MDN):
delete object.property
delete object['property']
delete object[index]
delete property
これは、リソースを手動でクリーンアップする必要がある GOTO や非構造化プログラミングのようなもので、C の ~Destructor のようなものです (同じではありません)。~a(); のようにオブジェクトを削除できます。ただし、「int i」のように「変数を 'UNDECLARE'」することはできません。