1. ホーム
  2. ジャバスクリプト

[解決済み] JavaScriptの変数をアンセットするには?

2022-03-03 22:12:33

質問

JavaScriptでグローバル変数(実際には window この値は前のスクリプトによってすでに入力されていますが、後で実行される別のスクリプトにその値や、それが定義されていることさえも知られたくないのです。

私は some_var = undefined で、テストの目的には有効です。 typeof some_var == "undefined" が、本当に正しい方法とは思えません。

あなたはどう思いますか?

解決方法は?

その 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_a は、ECMAScript の仕様で " と呼ばれる場所に作成されます。 変数環境 を使用する場合、これは関数の実行コンテキストになります。 var を考慮すると、もう少し複雑になるかもしれません。 let また、グローバルなコードの場合は 変数環境 はグローバルオブジェクトにアタッチされます(多くの場合 window ).

のリファレンスは VariableEnvironment は通常削除できません。 ECMAScript 10.5 の中で実行されない限りは、そのようなことは起こらないということです。 eval コンテキスト(ほとんどのブラウザベースの開発コンソールはこれを使用しています)で宣言された変数は var を削除することはできません。

2. 使用しない場合 var

を使わずに名前に値を代入しようとすると var キーワードを使用すると、JavaScript は ECMAScript 仕様で " と呼ばれている、名前付き参照の場所を特定しようとします。 レキシカル環境 "であり、主な相違点は レキシカル環境 はネストされる - つまり LxicalEnvironment は親を持ち (ECMAScript 仕様では "外部環境参照" と呼んでいます)、JavaScript がその参照を LexicalEnvironment を探すと、親である LxicalEnvironment (で詳しく説明しています)。 10.3.1 10.2.2.1 ). トップレベルの LexicalEnvironment は、"です。 グローバル環境 "で、その参照先がグローバルオブジェクトのプロパティであるという意味で、グローバルオブジェクトに束縛されています。そのため、もしあなたが var キーワードを現在のスコープや外側のスコープで使用すると、JavaScript は最終的に window オブジェクトを参照することができます。前に学んだように、オブジェクトのプロパティは削除することができます。

ノート

  1. を覚えておくことが重要です。 var 宣言は、常にそのスコープの先頭で起こったとみなされます。 var 文はそのままにされます。ですから、次のようなコードでは a からの参照です。 変数環境 であって window プロパティが作成され、その値は 10 を、コードの最後に追加してください。

    function test() { a = 5; var a = 10; }
    
    
  2. 上記は、"strict mode"が有効でない場合の話です。また、"strict mode" を使用しない場合、ウィンドウのプロパティに解決されたであろう字句の参照は、"strict mode" の下では "undeclared variable" エラーを発生します。私はこの指定がどこにあるのかよく理解していませんでしたが、これがブラウザの動作なのです。