変数の宣言方法
ES6の構文はES3と相対的なもので、最大の特徴はJSをより厳格にすることです。
- ES3変数の定義
- var
- function
- ES6 変数の定義
- Let
- const
- class
- import モジュールのインポート
letvar との違い
1.VAR変数リフティングの存在
console.log(n); //=>undefined
var n = 10;
console.log(n); //=>10
2.let変数のリフティングはありません。
console.log(n);
//=>Uncaught ReferenceError: Cannot access 'n' before initialization
//LET変数のリフティングがないので、宣言後にしか使えない。
let n = 10;
console.log(n); //=>10
3.VARは繰り返し宣言を許しますが、ブラウザ自身はそれを一度だけ認識し、エラーは報告しません。
var n = 12;
var n = 13;
console.log(n); //=>13
4、LETは、宣言を繰り返すことはできません:現在のコンテキストでは、どのような方法は、限り、この変数の宣言として、LETの繰り返し宣言に基づいてすることはできません。
let n = 12;
let n = 13;
console.log(n);
//=>Uncaught SyntaxError: Identifier 'n' has already been declared
5.再宣言するかどうかは、コード実行フェーズではなく、字句解析フェーズで検出されます。
var n = 12;
let n = 13; //=>Uncaught SyntaxError: Identifier 'n' has already been declared
console.log('OK');
var n = 12;
let n = 13; //=>エラーは報告されるが、OKは実行されない。
- グローバルな文脈では、VARで宣言された変数はグローバル変数であり、GO(ウィンドウ)に属性を設定することと同じであり、どちらもマッピングのメカニズムを確立しますが、LETで宣言された変数はグローバル変数でしかなく、GOとは何の関係もありません;
var n = 10;
console.log(window.n); //=>10
let n = 10;
console.log(window.n); //=>undefined
7、ブラウザにはバグがあります:変数のtypeof検出に基づいて宣言されていない、とエラーが報告されません、結果は "未定義 "ですが、ビューの正しい点からエラーが正常であることを報告する必要があります!
console.log(typeof n); //=>"undefined"
8、この変数が後でLETで宣言される場合、typeofの検出に基づいて再び前面がエラーを報告します:の宣言で使用することはできません。
console.log(typeof n); //=>Uncaught ReferenceError: Cannot access 'n' before initialization
let n = 10;
9.JS全体では、これまでに接触したコンテクストは以下の2種類のみです。
グローバル・コンテキストEC
EC(XX)関数の実行によって形成されるプライベートコンテキスト この時点では、ループ本体や判定本体などは独立したプライベートコンテキストを形成しておらず、その中の変数はすべて、その変数が置かれているコンテキストにあります。
if { var n = 10; console.log(n); //=>10 } console.log(n); //=>10
for {} console.log(i); //=>5
10.しかし、ES6では、ブロックレベルのスコープという新しい形式のコンテキストが提供されます。
LET/CONSTなどがオブジェクト/関数中括弧を除くすべての中括弧に存在する場合、現在ラップされている中括弧の部分は別のプライベートコンテキストを形成し、LET/CONSTに基づいて作成された変数は現在のブロックレベルのスコープドメインのプライベートとなります。
if { var n = 10; //=>nはグローバル変数 let m = 20; //=>mは中括弧で囲まれた現在のブロックレベルのプライベートスコープ private console.log(m); //=>20 } console.log(n); //=>10 console.log(m); //=>UncaughtReferenceError: mが定義されていません。
11.2つのクロージャーの形成
{
let x = 10,
y = 20;
console.log(x, y);
}
{
let x = 100,
y = 200;
console.log(x, y);
}
12, let loop: と自己実行関数はvarを与え、ループの各ラウンドは同様にクロージャを作成します。
1, 一般的なブロックレベルのスコープ(親スコープ)を作成します;
2.サイクルの各ラウンドは、新しいプライベートコンテキストを形成します。
iを外部で使用することはできません
letlet と const の違い
CONSTで宣言された変数は新しい値にリダイレクトできません。
let n = 10;
n = 20;
console.log(n); //=>20
const n = 10;
n = 20; //=>Uncaught TypeError: Assignment to constant variable.
console.log(n);
const obj = {
name: 'jack'
};
// obj = [10, 20];
//=>Uncaught TypeError: Assignment to constant variable.
//つまり、constで宣言された変数の新しい値を指すように変更することはできない。
obj.name = ' ;
//=>しかし、ポインタを変更することなく、ヒープメモリの情報を変更することはできる,
//constで宣言された変数は、ポインタを変更することはできないが、格納する値を変更することはできる。
console.log(obj);





