JavaScript 閉包經典問題:為什么輸出 10 次 i=10
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
問題代碼先觀察以下代碼,思考輸出結果: 輸出結果: 執行過程詳解 第一步:var 變量的作用域第二步:循環執行過程代碼高亮:
循環次數 i 的值 循環條件 (i < 10) --------------------------------------- 第 1 次 0 ? 通過 第 2 次 1 ? 通過 ... 第 10 次 9 ? 通過 10 ? 不通過,循環結束 循環結束后:i = 10 第三步:創建 10 個回調函數每次循環創建一個箭頭函數,都通過閉包引用變量 i 第四步:異步執行時序核心原因三個關鍵點
圖示理解:
解決方案方案 1:使用 let(推薦)?代碼高亮:
function f() { for(let i = 0; i < 10; i++) { setTimeout(() => { console.log('i=', i) }); } } 原理: let 是塊級作用域,每次循環創建新的 i 綁定 輸出: 方案 2:IIFE 立即執行函數原理: 通過函數參數保存每次循環的 i 值 方案 3:傳遞參數給 setTimeout原理: setTimeout 的第三個參數會傳遞給回調函數 知識點總結? 一句話總結var 的函數作用域 + 閉包共享變量 + setTimeout 異步執行 = 所有回調讀取到循環結束后的同一個 i 值(10) 參考文章:原文鏈接? 該文章在 2026/4/1 16:12:58 編輯過 |
關鍵字查詢
相關文章
正在查詢... |