5. スコープと再帰

1. 範囲

  1. スコープの概念: 変数または関数またはデータまたは関数、動作範囲、影響範囲、使用可能な範囲
  2. 範囲の分類:
    • グローバル スコープ: どの関数にも属さないステートメントはグローバル スコープと呼ばれます。グローバル スコープ内の変数はグローバル変数と呼ばれます。
    • ローカルスコープ: 関数が属する領域をローカルスコープといいます。ローカル スコープ内の変数はローカル変数と呼ばれます。
  3. スコープ間のデータのアクセス ルール (スコープのネスト後)
    • 親スコープは子スコープ内のデータを使用できません(親は子にアクセスできません)。
    • 子スコープは親スコープ内のデータを使用できます(子は親を取得できます)。
      var a = 10;
      function fn(){
              
              
          var b = 20;
          console.log(a);		// 10
          console.log(b);		// 20
      }
      fn();
      console.log(a);		// 10
      console.log(b);		// Error: b is not defined
      
  4. マルチレベルのスコープのネスト後の変数の読み取りおよび書き込みルール
    • 読む(使う):
      • まず独自のスコープ内で検索し、それを使用し、見つかった場合は検索を停止します。
      • 見つからない場合は、上位スコープを順番に検索します
      • レイヤーが見つかった場合は、それを使用して検索を停止します
      • 最上層まで見つからず、エラーを報告しました。
    • 書き込み(割り当て):
      • まず独自のスコープ内で検索し、見つかった場合は変更して検索を停止します。
      • 見つからない場合は、上位スコープを順番に検索します
      • レイヤーが見つかった場合は、それを変更して検索を停止します
      • 最上位レベルまで見つからなかったので、グローバルとして宣言してから変更するだけです。(非厳密モードでは、厳密モードではエラーが報告されます)
  5. さまざまなスコープの変数の特性
    • グローバル変数: グローバル環境に従い、常にメモリ内に存在し、メモリを占有します。
    • ローカル変数: ローカル環境に従って、ローカル スコープが作成され、変数が存在し、ローカル スコープが終了し、変数が削除され、メモリが節約されます。
    • 提案: グローバルの使用をできるだけ少なくし、匿名関数を使用して大きな新しいスコープを生成し、データと複数の関数をラップして再度使用するようにします。
      ;(function(){
              
              
          var a = 10;
          function box1(){
              
              
              console.log(a);		// 10
          }
          function box2(){
              
              
              a = 20;
              console.log(a);		// 20
          }
          function box3(){
              
              
              console.log(a);		// 20
          }
          box1();
          box2();
          box3();
      })();
      

2. ステートメントの改善

  • いわゆるステートメントのプロモーションとは、JS パーサーが JS コードを解析するときに、まず現在のスコープ内の変数宣言と関数宣言を、実行するスコープの先頭に進めます。これは、対応するスペースをメモリ内に作成することを意味します。将来的にプログラムを直接使用できるようにするため。
  • しかし、これは実際には js 言語に存在するバグであり、早期に宣言する利点は非常に小さく、逆にブロックレベルのスコープの概念がないと、さまざまなスコープ空間の汚染を引き起こすことになります。そのため、後のバージョン ES6 の新機能では、変数宣言の昇格が禁止されています。
  1. 宣言された変数の巻き上げ
    • var で宣言された変数はスコープの先頭で事前に宣言され、その場で代入されます。
      console.log(a);		// undefined
      var a = 10;
      console.log(a);		// 10
      
  2. 宣言された関数の巻き上げ
    • function で宣言された関数は、全体としてスコープの先頭に昇格されます。
      console.log(fn);		// function fn(){...}
      function fn(){
              
              
          console.log(1)
      }
      console.log(fn);		// function fn(){...}
      
  3. var が function と一致するとき
    • 代入作成関数: var fn = function(){}
      • 変数はプロモートされますが、関数はプロモートされません
        console.log(fun);			// undefined
        var fun = function(){
                  
                  
            console.log(2)
        }
        console.log(fun);			// function(){...}
        
    • var の変数名が function の関数名と同じ場合、var が先にプロモートされるため、function が有効になります。
      • 注: 重複した名前は許可されません。
        console.log(b);		// function b(){...}
        var b = 20;
        function b(){
                  
                  
            console.log(3);
        }
        console.log(b);		// 20
        

3. 再帰

  1. 再帰: 関数内でそれ自体を実行します。再帰を悪用すると、無限ループに似た現象が発生し、プログラムのクラッシュ、コンピューターのクラッシュ、メモリ オーバーフローが発生します。
    • 再帰の考え方を使用してプログラムの問題を解決し、関数の end ステートメントと連携し、必要に応じて再帰から抜け出します。
    • 通常の再帰でも多くのパフォーマンスを消費します
    • 使わなければならないときはできるだけ使わず、最小限で使えるときは使わない
  2. 引き渡す:
    • 自己永続的なプロセス
  3. 戻る:
    • 継続的にデータを外部に返すプロセス
  4. 再帰を使用して階乗を計算します (5! = 5 4 3 2 1) 。
// 已知:
// 5! = 5 * 4 * 3 * 2 * 1
// 5! = 5 * 4!
//          4! = 4 * 3!
//                   3! = 3 * 2!
//                            2! = 2 * 1!
//                                     1
// 可推算计算任意数的阶乘公式为:
// fn(n) = n * fn(n-1);
// ...
// fn(5) = 5 * fn(4);
// fn(4) = 4 * fn(3);
// fn(3) = 3 * fn(2);
// fn(2) = 2 * fn(1);
// 计算最小数字1的阶乘为:
// fn(1) = 1;
function fn(n){
    
    
	if(n === 1){
    
    
		return 1;
	}else{
    
    
		return n * fn(n-1);
	}
}
console.log( fn(5) );		// 120

4. オブジェクトの紹介

  1. オブジェクト: 客観的な物事の記述、論理的なデータの形式で客観的な物事を記述するプロセス

    • 順序付けされていないデータのパッケージング、オブジェクト オブジェクト、フラグは{}
    • 順序付けされたデータ、配列オブジェクト、フラグのパッキングは、[]
  2. オブジェクトの性質(組成)

    • キーと値のペア。Key(キー)とValue(値)は1対1に対応し、ペアで表示されます。
    • コロンはキーと値を接続するために使用され、カンマはキーと値のペアを区切るために使用されます。疑似コード:{ 颜色:红色, 身高:180, 体重:150, 发型:板寸 }
  3. オブジェクトの意味(機能):データの保存、プログラミング

  4. オブジェクトの作成

    • リテラル:var obj = {}
    • コンストラクタ:var obj = new Object()
  5. いずれの場合も、2 つのオブジェクトは等しくありません。等しい場合、それは 1 つのオブジェクトであることを意味します。

    var obj1 = {
          
          };
    var obj2 = new Object();
    var obj3 = {
          
          }
    var obj4 = obj1;
    console.log(obj1);		// {}
    console.log(obj2);		// {}
    
    console.log(obj1 === obj2);		// false
    console.log(obj1 === obj3);		// false
    console.log(obj4 === obj1);		// true
    
  6. オブジェクト操作構文

    • ドット構文: オブジェクトのプロパティが具体的な値の場合
    • 括弧の構文: オブジェクトのプロパティが変数の場合
      var a = "world";
      var obj = {
              
              
          title:"对象的操作",
          number:18,
          [a]:"啊哈哈哈"
      }
      var str = "number";
      console.log( obj.str );			// undefined
      console.log( obj[str] );		// 18
      console.log( obj.a );			// undefined
      console.log( obj.world );		// 啊哈哈哈
      console.log( obj["title"] );	// 对象的操作
      console.log( obj[title] );		// Error: title is not defined
      
  7. オブジェクト操作

    var person = {
          
          name:"张三", age:18};
    
    • 増加:
      person.sex = "男";
      person["sex"] = "男";
      
    • 消去:
      delete person.age;
      delete person["age"];
      
    • 変化
      person.sex = "女";
      person["sex"] = "女";
      
    • チェック
      console.log(person.name)
      console.log(person["name"])
      
  8. オブジェクトの分類 (理解)

    • ホスト オブジェクト: windowdocument
    • ローカル オブジェクト: コンストラクター。特定のオブジェクトを取得するには newを実行する必要があります: Object、、、、NumberStringBoolean
    • 組み込みオブジェクト: 直接使用できる公式に提供されたオブジェクト:Math

5. 練習する

  1. 再帰を使用して解決する関数を作成する
    • n が偶数の場合、関数を呼び出して 1/2+1/4+...+1/n を求めます。
    • n が奇数の場合、関数を呼び出して 1/1+1/3+...+1/n を求めます。
  2. 再帰を使用して 2 つの数値の最大公約数を見つけます
  3. 再帰を使用して、フィボナッチ数列の n 番目の桁 (1、1、2、3、5、8、13、21、...) を見つけます。

おすすめ

転載: blog.csdn.net/weixin_41636483/article/details/116140104