web-dev-qa-db-ja.com

宣言された変数と宣言されていない変数の影響

宣言された変数では削除演算子が機能しないため、JavaScriptの宣言された変数と宣言されていない変数の主な違いは何ですか?

 var y = 43;     // declares a new variable
 x = 42;

 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) 

なぜこれが起こるのですか?グローバルに宣言された変数は、ウィンドウオブジェクトのプロパティでもあるので、削除できないのはなぜですか?

28

宣言されたおよび宣言されていないグローバル変数

それらを保存してアクセスするメカニズムは同じですが、JavaScriptはconfigurable属性の値に基づいてそれらを異なる方法で処理する場合があります(以下で説明)。通常の使用では、それらは同じように動作するはずです。

どちらもグローバルオブジェクトに存在します

declaredundeclaredグローバル変数の比較を以下に示します。

var declared = 1;  // Explicit global variable (new variable)
undeclared   = 1;  // Implicit global variable (property of default global object)

window.hasOwnProperty('declared')    // true
window.hasOwnProperty('undeclared')  // true

window.propertyIsEnumerable('declared')    // true
window.propertyIsEnumerable('undeclared')  // true

window.declared     // 1
window.undeclared   // 1

window.declared   = 2;
window.undeclared = 2;

declared     // 2
undeclared   // 2

delete declared     // false
delete undeclared   // true
delete undeclared   // true (same result if delete it again)

delete window.declared     // false
delete window.undeclared   // true (same result if delete it yet again)
delete window.undeclared   // true (still true)

declaredundeclaredの両方のグローバル変数は、windowオブジェクト(デフォルトのグローバルオブジェクト)のプロパティです。どちらもプロトタイプチェーンを通じて別のオブジェクトから継承されません。どちらもwindowオブジェクトに直接存在します(- window.hasOwnProperty は両方に対してtrueを返します)。

構成可能な属性

declaredグローバル変数の場合、configurable属性はfalseです。 undeclaredグローバル変数の場合、trueです。以下に示すように、configurable属性の値は getOwnPropertyDescriptor メソッドを使用して取得できます。

var declared = 1;
undeclared = 1;

(Object.getOwnPropertyDescriptor(window, 'declared')).configurable     // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable   // true

プロパティのconfigurable属性がtrueの場合、プロパティの属性は defineProperty メソッドを使用して変更でき、プロパティは-を使用して削除できます delete 演算子。そうしないと、属性を変更できず、この方法でプロパティを削除できません。

非厳密モード の場合、delete演算子は、プロパティが構成可能な場合はtrueを返し、構成できない場合はfalseを返します。

概要

宣言されたグローバル変数

  • デフォルトのグローバルオブジェクト(window)のプロパティです
  • プロパティ属性は変更できません
  • delete演算子を使用して削除できない

宣言されていないグローバル変数

  • デフォルトのグローバルオブジェクト(window)のプロパティです
  • プロパティ属性は変更できます
  • delete演算子を使用して削除できます

こちらもご覧ください

26
Matt Coughlin

主な違いは、関数内で変数を宣言する場合です。関数内で変数を宣言するときにvarを使用すると、その変数はローカル変数になります。ただし、varを使用しない場合は、宣言した場所(関数の内部または外部)に関係なく、変数はグローバル変数になります。

1
Pat

JavaScriptの変数宣言を介して変数が作成されると、これらのプロパティは「DontDelete」属性で作成されます。作成した「削除」式を使用して削除することはできません。すべての関数、引数、関数パラメーターは、デフォルトではこのDontDelete属性で作成されます。 DontDeleteはフラグと考えることができます。

var y = 43;
delete y;         //returns false because it is has a DontDelete attribute

一方、宣言されていない割り当てでは、DontDeleteのような属性は設定されません。したがって、この宣言されていない変数にdelete演算子を適用すると、trueが返されます。

x = 42;
delete x;        //returns true because it doesn't have a DontDelete attribute

プロパティの割り当てと変数の宣言の違い—前者はそうではなく、後者はDontDeleteを設定します。そのため、宣言されていない割り当てによって削除可能なプロパティが作成されます。

削除演算子の正確な動作に関するリンク

1

削除は、オブジェクトのプロパティに対してのみ有効です。変数名や関数名には影響しません。

あなたの場合、x = 42;変数Xを宣言し、グローバルオブジェクトのプロパティにします。つまり、trueを返します。

そして、var y = 43;オブジェクトの一部ではないグローバル変数を宣言しているため、falseを返します。

0
Jay Bhatt