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が高徳地図マークを生成する.
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);
},