在程式設計中,閉包在從外部作用域捕捉變數方面發揮著至關重要的作用。然而,當在循環中使用時,它們可能會導致意想不到的結果,稱為閉包污染。本文探討了這個問題並提供了解決它的實用解決方案。
考慮以下程式碼:
<code class="javascript">var funcs = []; for (var i = 0; i < 3; i++) { funcs[i] = function() { console.log("My value:", i); }; } for (var j = 0; j < 3; j++) { funcs[j](); }</code>
不幸的是,此程式碼輸出:
<code>My value: 3 My value: 3 My value: 3</code>
而不是:
<code>My value: 0 My value: 1 My value: 2</code>而不是:
i
i
let
而不是:let
let
i
<code class="javascript">for (let i = 0; i < 3; i++) { funcs[i] = function() { console.log("My value:", i); }; }</code>
forEach
forEach
<code class="javascript">var someArray = [/* values */]; someArray.forEach(function(element) { // ...code specific to this element... });</code>而非🎜>
問題forEach
<code class="javascript">var funcs = []; function createFunc(i) { return function() { console.log("My value:", i); }; } for (var i = 0; i < 3; i++) { funcs[i] = createFunc(i); } for (var j = 0; j < 3; j++) { funcs[j](); }</code>
i
ES6 引入了
以上是如何克服循環中的封閉污染:實用指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!