この記事では主にJavaScriptの表示グローバル変数と暗黙的グローバル変数の違いを紹介します
JavaScriptではグローバル変数を宣言する方法が2つあります
宣言されたグローバル変数を表示するにはvarを使用します
var なしで宣言された暗黙的なグローバル変数
2 つの違いは、delete 演算子で削除できるかどうかです
まずコードを見てください
var a = 'a'; // 显式声明的全局变量 b = 'b'; // 隐式声明的全局变量 console.log(a); // a console.log(b); // b console.log(window.a); // a console.log(window.b); // b
js では、グローバル変数は実際にはグローバル オブジェクト (ウィンドウ) 属性なので、両方の方法で宣言されたグローバル変数はウィンドウを通じて取得できます
削除には delete を使用してみてください
// 显式声明的全局变量不能被删除 delete a; // 返回 false // 隐式声明的全局变量可以被删除 delete b; // 返回 true // 删除情况 console.log(typeof a); // string console.log(typeof b); // undefined
delete 演算子はオブジェクトの属性を削除できますが、属性は、削除時に false を返します (厳密モードでは例外がスローされます)
これは、var を使用して宣言された変数は設定できないことを意味します。 getOwnPropertyDescriptor を使用して、検証のために属性の特性を記述するオブジェクトを取得します。この 2 つの違いは、明示的に宣言された変数は構成可能ではなく、削除演算子を使用して削除できないことです。構成可能な値が false になると、属性の特性を記述するオブジェクトは変更できないため、属性記述子を変更することはできません。そのため、明示的に宣言されたグローバル変数は delete によって削除できますが、逆に、暗黙的に宣言されたグローバル変数が delete によって削除されないようにすることもできます
Object.getOwnPropertyDescriptor(window, a); // {value: "a", writable: true, enumerable: true, configurable: false} Object.getOwnPropertyDescriptor(window, b); // {value: "b", writable: true, enumerable: true, configurable: true}
以下は他のネチズンの追加です
グローバル変数と暗黙的JavaScript のグローバル変数
暗黙的なグローバル変数と明示的に定義されたグローバル変数の間には小さな違いがあり、それは、delete 演算子を使用して変数を未定義のままにする機能です。
1. var で作成したグローバル変数(関数以外のプログラムで作成したもの)は削除できません。
2. var を使用せずに作成された暗黙的なグローバル変数は (関数内で作成されたかどうかに関係なく) 削除できます。 これは、技術的には、暗黙的なグローバル変数は実際にはグローバル変数ではなく、グローバル オブジェクトのプロパティであることを示しています。プロパティは delete 演算子を使用して削除できますが、変数は削除できません:b = 'b'; var descriptor = Object.getOwnPropertyDescriptor(window, b); descriptor.configurable = false; Object.defineProperty(window, b, descriptor); delete b; // 返回 false
ブラウザでは、グローバル オブジェクトは window 属性を介してコード内のどこからでもアクセスできます (ローカル オブジェクトを宣言するなど、とんでもないことをしない限り) window という名前の変数)。ただし、他のコンテキストでは、この便利なプロパティは別の名前で呼ばれる場合があります (またはプログラムで使用できない場合もあります)。ハードコーディングされたウィンドウ識別子を使用せずにグローバル オブジェクトにアクセスする必要がある場合は、関数スコープの任意のレベルで次の操作を行うことができます:
// 定义三个全局变量 var global_var = 1; global_novar = 2; // 反面教材 (function () { global_fromfunc = 3; // 反面教材 }()); // 试图删除 delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // 测试该删除 typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined"
このメソッドは、グローバル オブジェクトがいつでも取得できます。関数は関数として呼び出されます (new を通じて構築されません)。これは常にグローバル オブジェクトを指します。実際、このバグは ECMAScript 5 の厳密モードには当てはまらないため、厳密モードでは別の形式を取る必要があります。たとえば、JavaScript ライブラリを開発している場合は、コードを即時関数でラップし、グローバル スコープからこれへの参照を即時関数のパラメーターとして渡すことができます。
上記は、JavaScript 表示グローバル変数と暗黙的グローバル変数の違いです。この 2 つの基本的な違いは、明示的に宣言された変数は構成可能ではなく、削除演算子を使用して削除できないことです
その他の JavaScript 表示グローバル変数と暗黙的グローバル変数違いに関する記事については、PHP 中国語 Web サイトに注目してください。