[解決済み] JavaScriptの変数をアンセットするには?
質問
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
オブジェクトを参照することができます。前に学んだように、オブジェクトのプロパティは削除することができます。
ノート
-
を覚えておくことが重要です。
var
宣言は、常にそのスコープの先頭で起こったとみなされます。var
文はそのままにされます。ですから、次のようなコードではa
からの参照です。 変数環境 であってwindow
プロパティが作成され、その値は10
を、コードの最後に追加してください。function test() { a = 5; var a = 10; }
-
上記は、"strict mode"が有効でない場合の話です。また、"strict mode" を使用しない場合、ウィンドウのプロパティに解決されたであろう字句の参照は、"strict mode" の下では "undeclared variable" エラーを発生します。私はこの指定がどこにあるのかよく理解していませんでしたが、これがブラウザの動作なのです。
関連
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】SyntaxError: 'import' と 'export' は 'sourceType: module' とだけ表示されるかもしれない - Gulp
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】エラー:リスン EACCES 0.0.0.0:80 OSx Node.js
-
[解決済み】Uncaught SyntaxError: JSON の位置 0 に予期しないトークン u があります。
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない