JavaScript はグローバル変数と暗黙的グローバル変数の違いを表示します

高洛峰
リリース: 2017-02-11 15:50:48
オリジナル
1015 人が閲覧しました

この記事では主に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 サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!