JavaScript が変数を宣言するために使用するキーワードはどれですか?

醉折花枝作酒筹
リリース: 2023-01-06 11:17:05
オリジナル
4775 人が閲覧しました

js では、var、let、const キーワード宣言を使用できます。 var で宣言された変数は、あらゆるタイプの値を保存するために使用でき、スコープは関数スコープです。let で宣言された変数は {} で使用され、変数のスコープはブロックレベルのドメインに制限されます。const が使用されます。定数を変更するため、宣言位置は制限されません。

JavaScript が変数を宣言するために使用するキーワードはどれですか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

変数キーワード var、let、const を宣言します

ECMAScript 変数は大まかに型付けされています。つまり、変数はあらゆるタイプのデータの保存に使用でき、各変数は保存に使用される単なる変数です。 any 値の名前付きプレースホルダー。

1.var キーワード

var で宣言された変数は、JavaScript の他の言語と同様に、あらゆるタイプの値を保存するために使用できます (未定義の特別な値は初期化せずに保存されます)。変数を定義するときに、変数に値を割り当てることもできます。変数は、割り当てられた値を保存する変数として定義されます。JavaScript は動的言語であるため、変数を初期化するときに、割り当てられたデータ型として識別されません、しかし、ただの簡単な課題です。次に、保存された値を変更できるだけでなく、値の型も変更できます。

var message = "hi";
	message = 100;
ログイン後にコピー

1.1.var 宣言スコープ

var 演算子を使用して定義された変数は、ローカル変数になります。それを含む関数の変数。たとえば、関数内で var を使用して変数を定義すると、関数の終了時に変数が破棄されることになります。これがガベージ コレクションと呼ばれるものだと思います。

function test( ) {
		vart message = "hi";	//局部变量
	}
test( );
console.log(message);	//报错!
ログイン後にコピー

関数が呼び出された後、変数はしたがって、最後の行ではエラーが報告されます。ただし、関数で変数を定義するときに var 演算子を省略すると、グローバル変数を作成できます。

function test( )  {
	message = "hi";	//全局变量
}
test( );
console.log(message);	//"hi"
ログイン後にコピー

関数 test() が 1 回呼び出されるだけで、グローバル変数メッセージが定義され、グローバル変数メッセージを作成できます。関数外でアクセスされます。ただし、ローカル スコープで定義されたグローバル変数は保守が難しいため、一般的には推奨されません。

1.2. Var 宣言の昇格

var キーワードを使用して宣言された変数は、関数スコープの最上位、いわゆる「ホイスト」 (ホイスト) に自動的に昇格されます。 , すべての変数宣言がプルされます 関数スコープの先頭に移動します:

function fool( ) {
	console.log(age);
	var age = 28;
}
fool( );	//undefined
ログイン後にコピー

ここではエラーは報告されませんが、未定義が表示されます。ECMAScript は実行時に次のコードと同等として扱います:

function fool( ) {
	var age;
	console.log(age);
	age = 28;
}
fool( );	//undefined
ログイン後にコピー

2 .let 宣言

let と var の関数は似ていますが、非常に重要な違いがあります。最も明らかな違いは、let 宣言のスコープがブロック スコープであるのに対し、var 宣言のスコープは関数スコープであることです。

if (true) {
	let age = 26;
	console.log(age);	//26
}
console.log(age);	//ReferceError:age没有定义
ログイン後にコピー

age 変数のスコープはブロックの内部に制限されます。したがって、if ブロックの外では参照できません。ブロック スコープは関数スコープのサブセットであるため、var に適用されるのと同じスコープ制限が let にも適用されます。

Let では、同じスコープ内に冗長な宣言を出現させることもできません (var can):

var name;
var name;
let age;
let age;	//SyntaxError;标识符age已经声明过了
ログイン後にコピー

さらに、冗長な宣言エラーは、var と let を混合しても影響を受けません。これら 2 つのキーワードは、異なる型の変数を宣言するものではなく、関連するスコープ内で変数がどのように存在するかを示すだけです。

2.1. 一時的なデッドゾーン

let と var のもう 1 つの重要な違いは、let で宣言された変数はスコープ内でプロモートされないことです:

//name会提升
console.log(name);	//undefined
var name = 'matt';

//name不会提升
console.log(name);	//ReferenceError:name没有定义
let name = 'matt';
ログイン後にコピー

2.2. グローバル宣言

var とは異なり、let を使用してグローバル スコープで宣言された変数はウィンドウ オブジェクトの属性にはなりません (var で宣言された変数は属性になります):

var name = 'matt';
console.log(window.name);	//'matt'

let name = 'matt';
console.log(window.name);	//undefined
ログイン後にコピー

ただし、let 宣言は依然としてグローバル スコープの場合、対応する変数はページの宣言サイクル内で保持されます。

2.3. 条件宣言

let のスコープはブロックであるため、同じ名前の変数が以前に let を使用して宣言されているかどうかを確認することはできません。宣言せずに宣言します。 try/catch または typeof 演算子を使用しても、条件ブロック内の let 宣言の範囲がそのブロックに制限されているため、この問題を解決することはできません。このため、新しい ES6 宣言キーワード let は条件付き宣言パターンに依存できません。

2.4. for ループ内の Let ステートメント

var を使用する場合、最も一般的な問題は、反復変数の奇妙な宣言と変更です:

for(var i = 0; i < 5; ++i) {
	setTimeout( () => console.log(i) ,0)
}
//你可能以为会输出0、1、2、3、4
//实际上输出的是5、5、5、5、5
ログイン後にコピー

ループを終了するときその間、反復変数には、ループを終了する原因となった値が保持されます。 5. setTimeout タイムアウト ロジックが後で実行される場合、i は同じ変数であるため、最終出力は同じ値になります。

let を使用して反復変数を宣言すると、JavaScript エンジンはバックグラウンドで反復ループごとに新しい反復変数を宣言し、各 setTimeout は異なる変数インスタンスを参照します:

for(let i = 0; i < 5; ++i) {
	setTimeout( () => console.log(i) ,0)
}
//会输出0、1、2、3、4
ログイン後にコピー

3 .const 宣言

const の動作は基本的に let と同じです。唯一の重要な違いは、変数を宣言すると同時に変数を初期化する必要があることと、const で宣言された変数を変更しようとすることです。実行時エラーが発生します。

const声明的限制只适用于它指向的变量的引用。如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制:

const person = { };
person.name = &#39;matt&#39;;
ログイン後にコピー

4.使用建议

let和const是ES6中新增的,从客观上为JavaScript更精确地声明作用域和语义提供更好的支持。

4.1.不使用var

    限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

4.2.const优先,let次之

    使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,我们应该优先使用const来声明变量,只有在提前知道未来会有修改时再使用let。

【推荐学习:javascript高级教程

以上がJavaScript が変数を宣言するために使用するキーワードはどれですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート