ES 6に追加されたブロックレベルのスコープlet

12517 ワード

ES 6に追加されたブロックレベルのスコープlet
2015年前に、JavaScriptはブロックレベルの機能領域がないので、その後ES 6バージョンにブロックレベルの作用領域が追加されました.ES 6の新しい特性をよりよく理解するために、まずこのいくつかの問題を提出します.2.なぜブロックレベルのスコープを追加しますか?3.ブロックレベルのスコープはどう使いますか?
ブロックレベルのスコープは何ですか?
ブロックレベルのスコープとは、ステートメントブロックの範囲内でのみ機能することを意味し、この範囲を超えたら無効となり、ステートメントブロックとは、複数のステートメントをペアの大括弧{}の中に入れることを指し、通常はフロー制御に用いられ、例えばif,for,whileなど.
while (x < 10) {
  if(x>5){
  x++;
  }
}
ここ{if(x>5){x++;}}はステートメントブロックであり、{x++;}もステートメントブロックであり、巧記:大かっこのペアはステートメントブロックであり、一つのスコープを表している.
なぜブロックレベルのスコープを追加しますか?
ES 6の前に、変数はグローバルスコープ(大域変数ともいう)と関数スコープ(局所変数)だけだったので、以下のような不合理な状況を引き起こします.
1.関数の局所変数は、同じ名前のグローバル変数をカバーします.
      var a = 0
      (function() {
        console.log('         a:', a) //  :         a: 0
      })()
      console.log('    a:', a) //  ;    a: 0
      var a = 0
      ;(function() {
        console.log('a=', a) //  :a= undefined,       a=0
        if (false) {
          var a = 1
          console.log(a)
        }
      })()
その理由:変数の昇格により、内層のa変数が外層のa変数をカバーします.
これは、関数内でグローバル変数を呼び出すと、関数内で宣言されているローカル変数とグローバル変数とは必ずしも同名ではないという結果になります.
2.関数内部では、変数を宣言した後、関数が終了する前に使用できます.
      (function() {
        console.log(a) //  :undefined
        if (true) {
          for (var a = 0; a < 10; a++) {
            var b = 0
            console.log(a) //  :0~9
          }
        }
        console.log('if  a:', a) //  :if  a: 10
        console.log('if  b:', b) //  :if  b: 0
      })()
forサイクルで宣言したa,b変数は、関数が終了する前に破壊されません.
これはいくつかの不必要なメモリの消費をもたらします.この二つの不合理な問題を回避するために、ブロックレベルのスコープが出現しました.
ブロックレベルのスコープはどう使いますか?
変数コマンドletを使用します.
      (function() {
        if (true) {
          for (let a = 0; a < 10; a++) {
            console.log(a) //  :0~9
          }
        }
        console.log('if  a:', a) //  :ReferenceError: a is not defined
      })()
letコマンドの変数:
  • スコープ:変数があるステートメントブロック、つまり、大かっこのペア();
  • には変数が存在しません.一時的にデッドタイムということです.つまりブロックレベルのスコープから宣言まではこの変数にアクセスできません.
  • 同じブロックの中で、同じ変数名で重複して宣言することはできません.
  • クラシックケース:letコマンドがクローズド機能の代わりにクローズドされた実装:
  • var arr = [];
    for(var i = 0; i < 2; i++){
        arr[i] = (function(i){
            return function(){
                console.log(i);
            };
        }(i));
    };
    arr[1]();
    
    let実装:
    'use strict';
    var arr = [];
    for(let i = 0; i < 2; i++){
        arr[i] = function(){
            console.log(i);
        };
    };
    arr[1]();
    
    参考記事:
  • ES 6のうち、ブロックレベルのスコープは何ですか?運用はどこですか?
  • 変数スコープ