2.5キャビネット

1515 ワード

エンクロージャ

  • エンクロージャは、「関数と関数の外部変数の関係」
  • を意味する言葉です.
  • エンクロージャ=>スキャン、非同期、var(ゴミ)
  • エンクロージャに問題があるx
  • エンクロージャによる問題解決
  • for文(重複文)非同期とともに使用する場合、
  • が頻繁に発生する.
    function a() {
    	for (var i = 0; i < 5; i++) {
        	setTimeout(() => {
            	console.log(i)
            }, i * 1000);
        }
    }
    a();
    
    * 결과: 5, 5, 5, 5, 5
    * 해결법은 var을 let으로 바꾸거나 즉시 함수를 사용한다

    エラー発生の原因

  • varでiを宣言すると、iはa関数のscopeに存在します.
  • for文のため、settimeout関数はそれぞれ5つのscopeを作成します.
  • settimeoutは非同期関数であり、呼び出しスタックが空のときに
  • を実行する.
  • settimeoutでは、iの状態がi=5であることを示す.
  • だから結果は5,5,5,5,5,5
  • 解決策

  • 即時実行関数
  • function a() {
    	for (var i = 0; i < 5; i++) {
        	(function(j) {
            	setTimeout(() => {
            		console.log(i)
            	}, i * 1000);
            })(i)
        }
    }
    a();
  • for文に関数を再作成し、
  • を直ちに実行します.
  • このようにiをパラメータとして各関数
  • に渡す.
    各関数のi=0...settimeoutはバックグラウンドに格納される
  • var
  • の代わりにletを使用する
    function a() {
    	for (let i = 0; i < 5; i++) {
        	setTimeout(() => {
            	console.log(i)
            }, i * 1000);
        }
    }
    a();
  • iをletと宣言すると、varとは異なり、iはa scopeではなくfor scopeとして指定されます.
  • forの中のsettimeoutはiを...
  • PS:エラー:図中でsetTime(5)=>setTime(4)に変更する必要があります