let解決forサイクル中のクローズド

2458 ワード

シーン
  • クローズド発生
  • 内部関数は外部作用領域変数に依存しています.すなわち、外部参照が解放されない(参照変数が継続されるライフサイクル、延命)
  • です.
  • 変数の本質は、実際には1つのプレースホルダであり、その値こそが真の操作対象
  • である.
  • 値は、各言語のスカラーであってもよく、メモリアドレス(すなわち、一般的な参照タイプ)
  • であっても良い.
  • var VS let
  • letブロックレベル用ドメイン(ES 5より前のjsはブロックレベル機能領域が存在しません)
  • ブロックレベルのスコープ内で、let宣言の変数はこの領域のメモリに
  • だけ続くことができます.
  • varはブロックの問題がないので、ブロックの外で生活を続けてもいいです.
  • とforの関係
  • var初期変数はfor循環体内で上書きされています.Cを使うと共用体、つまり同じメモリアドレスを共有する
  • です.
  • let初期変数は、各forサイクルにおいて、独立した変数であり、独自のメモリアドレスを持っています.
  • 関数体の内部には内部に存在しない変数が参照されており、上位の作用領域内の同名の変数
  • を探しています.
  • let+for+fn
  • for文ブロック内の関数は、階層let宣言変数
  • を参照している.
  • 関数は、外部作用領域変数を参照しても自動的に解放されません.すなわち、この関数が呼び出されると、メモリに保存されます.
  • まとめ
  • for循環体内定義fnは、関数がforブロックvar変数を使用している場合、for文でこの関数を外挿し、この関数が採用するvar値は循環終了後のvar値
  • である.
  • は、ブロック内のlet変数と同じレベルの関数体がこのlet変数を使用した後、関数を呼び出します.関数は、指定された時のブロック内のlet変数値を使用します.
  • キーは、同じ値(またはアドレス)を使うかどうか
  • です.

  • コード
    jsが高徳地図マークを生成する.
     buildMarkers() {
          //        
          this.markers = [];
    
          var image = ROAST_CONFIG.APP_URL + "/storage/img/coffee-marker.png";
          //       
          var icon = new AMap.Icon({
            image: image,
            imageSize: new AMap.Size(19, 33)
          });
    
          for (var i = 0; i < this.cafes.length; i++) {
            //                  
            var marker = new AMap.Marker({
              position: new AMap.LngLat(
                parseFloat(this.cafes[i].longitude),
                parseFloat(this.cafes[i].latitude)
              ),
              title: this.cafes[i].location_name,
              icon: icon,
              //       ,    
              extData: {
                cafe: this.cafes[i]
              },
              map: this.map,
              clickable: true
            });
    
            //        ,    let       ,    for                 ,              ,               
            //   mark             。  js     ,        (          )      ,      
            //  var  ,   for          , infoWindow  for       
            let infoWindow = new AMap.InfoWindow({
              content: this.cafes[i].name +'_'+ this.cafes[i].location_name
            });
    
            //             ,             
            marker.on("click", function() {
              infoWindow.open(this.getMap(), this.getPosition());
            });
    
            this.infoWindows.push(infoWindow);
    
            //         
            this.markers.push(marker);
          }
          //            
          this.map.add(this.markers);
        },