ES 6定義変数

2591 ワード

一、letコマンド
  • 変数のアップグレードは存在しません.es 5のvarには変数リフトの問題があるが、es 6のletおよびconstには変数リフトの問題はない.
  • 一時的なデッドゾーン.ブロックレベルの役割ドメイン内にletコマンドが存在する限り、宣言された変数はこの領域にバインドされ、外部の影響を受けません.Es 6は、ブロックにletおよびconstの命令が存在する場合、このブロックがこれらの命令に対して宣言する変数は、最初から閉鎖的な役割ドメインを形成し、宣言前にこれらの変数を使用すると、エラーを報告することを明確に規定している.typeofを使っても間違えます.
  • var tmp = 123;
    
    if(true){
        tmp = "abc"; //ReferenceError tmp is not defined
        let tmp;
    }
    
  • は、繰り返し宣言を許可しません.letおよびconstは、同じ役割ドメイン内で同じ変数を繰り返し宣言することを許さない.
  • //   
    function func() {
        let a = 10;
        var a = 1;
    }
    
    //   
    function func() {
        let a = 10;
        let a = 1;
    }
    
    //             
    function func(arg) {
        let arg; //   
    }
    
    function func(arg) {
        {
            let arg; //    
        }
    }
    

    二、ブロックレベルの作用領域
  • es 5にはグローバル役割ドメインと関数役割ドメインしかなく、ブロックレベルの役割ドメインはありません.これは多くの不合理なシーンを引き起こす可能性があります.
  • //             
    var tmp = 123;
    
    function f() {
        console.log(tmp);
        if (false) {
            var tmp = 'hello world';
        }
    }
    
    f(); // undefined
    
    //                
    var s = 'hello';
    for (var i = 0; i < s.length; i++) {  
        console.log(s[i]);
    }
    console.log(i); // 5
    
  • es 6のブロックレベル役割ドメイン
  • function f1() {
        let n = 5;
        if (true) {
            let n = 10;
        }
        console.log(n); // 5
    }
    
  • es 6は、ブロックレベルの役割ドメインの任意のネストを可能にし、ブロックレベルの役割ドメインの出現は、グローバル変数でない限り、広く適用されている即時実行関数式(IIFE)が不要になる.
  • // IIFE   
    (function () {
        var tmp = ...;
        ...
    }());
    
    //        
    {
        let tmp = ...;
        ...
    }
    

    三、constコマンド
  • constは読み取り専用の定数を宣言し、いったん宣言すると定数の値は変更できません.
  • const変数が宣言されると、すぐに初期化する必要があり、後で値を割り当てることはできません.
  • constは、付与動作を規定する.
  • const a = 1;
    a = 2;//  
    
    const arr = [];
    arr.push(1) //[1] 
    //            ,const         ,             。         
    
    arr = [];//          。  arr        。
    

    四、最上位オブジェクト属性とグローバル変数
  • 最上位オブジェクト、ブラウザ環境ではwindowオブジェクト、nodeではglobalオブジェクトを指します.ES 5では,最上位オブジェクトの属性はグローバル変数と等価である.
  • window.a = 1;
    a // 1
    
    a = 2;
    window.a // 2
    
  • es 6に導入されたletconstclassによって宣言されたグローバル変数は、最上位オブジェクトの属性ではありません.しかし、varfunctionで宣言された変数は依然としてグローバルオブジェクトの属性に属している.
  • var a = 1;
    window.a // 1
    
    let b = 1;
    window.b // undefined