温故知新編の『JavaScript忍者秘籍(第二版)』学習総括(三)――閉包と作用領域


前言
この本の電子版はすでに学習総括の第一編にダウンロードリンクを入れました.温故而、知新編の『JavaScript忍者秘籍(第二版)学習総括(一)』を調べに行きます.
あなたが自粛してどこに使ったら、どこであなたが成功しますか?早く耐えられないと、苦しみも耐えられなくなります.
頑張ってください.兄弟たち.
まず自己増加関数を一つください.
var addnum= function(){
  var num=0; //          
  return  function(){
    return num++
  }
}
const Addnum= addnum()
Addnum()
console.log(Addnum()) // 1
console.log(Addnum()) // 2
プライベート変数をカプセル化
function Ninja() {
 var feints = 0;
 this.getFeints = function() {
  return feints;
  };
  this.feint = function() {
   feints++;
  };
}
var ninja1 = new Ninja();
ninja1.feint();
コンテキストを実行してコードを追跡します.
二つのタイプのコードを持っていると、両方の実行コンテキストがあります.大域実行コンテキストと関数実行コンテキスト.両者の最も重要な違いは:
  • グローバル実行コンテキストは一つだけで、JavaScriptプログラムが実行を開始するとグローバルコンテキストが作成されました.
  • において、関数実行コンテキストは、関数を呼び出すたびに新しいものを作成します.
  • 変数のキーワードと用語環境を定義します.
    キーワードvar
    var globalNinja = "Yoshi";  //⇽---      var      
    
    function reportActivity() {
      var functionActivity = "jumping";  //⇽---      var           
    
      for (var i = 1; i < 3; i++) {
         var forMessage = globalNinja + " " + functionActivity;   //⇽---      var for         
         console.log(forMessage === "Yoshi jumping",
             "Yoshi is jumping within the for block");  //⇽---  for           ,              
         console.log(i, "Current loop counter:" + i);
      }
    
      console.log(i === 3 && forMessage === "Yoshi jumping",
          "Loop variables accessible outside of the loop");  //⇽---    for    ,     for        
      }
    
    reportActivity();
    console.log(typeof functionActivity === "undefined"
       && typeof i === "undefined" && typeof forMessage === "undefined",
       "We cannot see function variables outside of a function");  //⇽---                  ”
    これは、varによって宣言された変数が、実際には最も近い関数内または大域的なロケーション内に登録されており、ブロックレベルのスコープには関心がないからである.
    letとconstを使用して、ブロックレベルの作用領域を持つ変数を定義します.
    const GLOBAL_NINJA = "Yoshi";  //⇽---   const      ,             
    
    function reportActivity() {
     const functionActivity = "jumping";   //⇽---   const          
    
      for (let i = 1; i < 3; i++) {
         let forMessage = GLOBAL_NINJA + " " + functionActivity;   //⇽---   let for         
         console.log(forMessage === "Yoshi jumping",
             "Yoshi is jumping within the for block");
         console.log(i, "Current loop counter:" + i);   //⇽---  for   ,               、         
      }
    
      console.log(typeof i === "undefined" && typeof forMessage === "undefined",
          "Loop variables not accessible outside the loop");  //⇽---   , for        for      
    }
    
    reportActivity();
    console.log(typeof functionActivity === "undefined"
       && typeof i === "undefined" && typeof forMessage === "undefined",
       "We cannot see function variables outside of a function");  //⇽---    ,                    
    varと違って、letとconstはもっと直接的です.letおよびconstは、最も近いロケーションにおいて変数を直接定義する(ブロックレベルのスコープ内、循環内、関数内、またはグローバル環境内であってもよい).ブロックレベル、関数レベル、グローバルレベルの変数はletとconstを使用して定義できます.
    ロケーションに識別子を登録する
    const firstRonin = "Kiyokawa";
    check(firstRonin);
    function check(ronin) {
     assert(ronin === "Kiyokawa", "The ronin was checked! ");
    }
    まずcheck関数を実行してから声明します.何のためですか?JavaScriptコードの実行は実際には二つの段階に分けて行われます.
  • は第一段階でコードは実行されませんでしたが、JavaScriptエンジンは現在のロケーションで宣言されている変数と関数にアクセスして登録します.JavaScriptは第一段階で完成した後
  • は、第2段階の実行を開始し、具体的には、変数の種類(let、var、constおよび関数宣言)および環境タイプ(大域環境、関数環境、またはブロックレベル作用領域)に依存する.
  • JavaScriptの使いやすさの典型的な特徴は、関数の宣言順序がどうでもいいことである.
    関数の再ロード
    console.log(fun); // function
    var fun =3;
    function fun(){
    
    }
    console.log(fun); // 3
    関数変数が向上しましたが、環境を通して処理全体をより深く理解する必要があります.JavaScriptのこのような挙動は、識別子登録の結果によって直接もたらされる.
  • は、処理プロセスの第2ステップにおいて、関数宣言によって定義された関数をコード実行前に作成し、対応する識別子に値を付与する.
  • は、第3段階で変数の宣言を処理し、現在の環境では宣言されていない変数はundefinedに割り当てられます.
  • 例では、第2ステップの関数宣言の登録時に、識別子funが既に存在しているため、undefinedに値が割り当てられていない.これは第1のテストfunが関数であるかどうかを判定します.その後、割当文var fun=3が実行され、数字3が識別子funに割り当てられる.この割当文を実行した後、funは関数を指すのではなく、数字3を指します.
  • 結び目
  • は、閉じられたパケットを作成する際の環境内のすべての変数にアクセスすることができる.関数の作成時におけるスコープの関数と変数をクローズドして、「安全気泡」を作成します.このようにして、関数を作成する際に必要なスコープがなくなっても、関数は実行時に必要なすべての内容を得ることができます.
  • 私たちは、これらの高級機能を使用することができます:
  • オブジェクトの私有属性は構造関数内の変数および構造法によってシミュレートされる.
    コールバック関数を処理して、コードを簡略化します.
  • JavaScriptエンジンは、コンテキストスタック(コールスタック)追跡関数の実行を実行することによって実行される.関数を呼び出すたびに、コンテキストを実行するために新しい関数を作成し、スタックの先頭にプッシュします.関数の実行が完了すると、対応する実行コンテキストがコールスタックから開始されます.
  • JavaScriptエンジンは、語法環境により識別子(通称スコープ)を追跡する.
  • は、JavaScriptにおいて、グローバルレベル、関数レベル、またはブロックレベルの変数を定義することができます.
  • は、キーワードvar、let、const定義変数を使用することができる.
  • キーワードvarは、最も近い関数レベルの変数またはグローバル変数を定義します.
    キーワードletとconstは、一回だけ与えられる変数を定義します.
  • クローズドは、JavaScript作用領域規則の副作用である.関数が作成されたときのスコープが消えた後も、関数を呼び出すことができます.
  • 『美』John Resig Beer Bibeault Josip Maas.『JavaScript忍者秘籍(第2版)』iBook.