JavaScript 変数の設定を解除するにはどうすればいいですか? 質問する

JavaScript 変数の設定を解除するにはどうすればいいですか? 質問する

JavaScript に、以前のスクリプトによってすでに設定されているグローバル変数 (実際にはwindowプロパティですが、重要ではないと思います) がありますが、後で実行される別のスクリプトでその値や、それが定義されていることさえ確認されたくありません。

some_var = undefinedテストの目的でこれを実行しましたがtypeof some_var == "undefined"、それが正しい方法だとは思えません。

どう思いますか?

ベストアンサー1

演算子deleteはオブジェクトからプロパティを削除します。変数を削除することはできません。したがって、質問の答えは、グローバル変数またはプロパティがどのように定義されているかによって異なります。

(1) で作成された場合はvar削除できません。

例えば:

var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1

(2)を使わずに作成した場合はvar削除することができます。

g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined

技術的説明

1. 使用var

この場合、参照はg_aECMAScript仕様で「変数環境現在のスコープにアタッチされている " - 関数内で使用する場合、これは関数実行コンテキストである可能性がありますvar( を考慮すると、もう少し複雑になる場合がありますlet)。または、「グローバル」コードの場合は、VariableEnvironment がグローバル オブジェクト (多くの場合window) にアタッチされます。

VariableEnvironment内の参照は通常は削除できません。ECMAScript 10.5これについては詳しく説明されていますが、コードがコンテキスト内で実行されない限りeval(ほとんどのブラウザベースの開発コンソールが使用)、 で宣言された変数はvar削除できないと言えば十分でしょう。

2. 使用せずにvar

キーワードを使用せずに名前に値を割り当てようとするとvar、JavaScriptはECMAScript仕様で「語彙環境」と異なり、主な違いはLexicalEnvironmentがネストされていることです。つまり、LexicalEnvironmentには親(ECMAScript仕様では「外部環境参照」と呼ばれます)があり、JavaScriptがLexicalEnvironment内で参照を見つけられない場合は、親のLexicalEnvironment内を探します(詳細は10.3.1そして10.2.2.1)。最上位レベルのLexicalEnvironmentは「地球環境"であり、その参照がグローバル オブジェクトのプロパティであるという点で、グローバル オブジェクトにバインドされています。したがって、var現在のスコープまたは外部スコープでキーワードを使用して宣言されていない名前にアクセスしようとすると、JavaScript は最終的にその参照として機能するオブジェクトのプロパティを取得しますwindow。前に学習したように、オブジェクトのプロパティは削除できます。

ノート

  1. var宣言は「巻き上げられる」、つまり、宣言が属するスコープの最初に発生したと常にみなされるということを覚えておくことが重要です。ただしvar、ステートメントで実行される値の初期化はそのまま残ります。したがって、次のコードでは、はプロパティではなくVariableEnvironmentaからの参照であり、その値はコードの末尾にあります。window10

    function test() { a = 5; var a = 10; }
    
  2. 上記の説明は、「厳密モード」が有効になっていない場合です。「厳密モード」を使用する場合、検索ルールは少し異なり、「厳密モード」なしでウィンドウ プロパティに解決される語彙参照は、「厳密モード」では「宣言されていない変数」エラーを発生させます。これがどこで指定されているのかよくわかりませんでしたが、ブラウザの動作の仕方です。

おすすめ記事