<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-211130ba7a.css">
最近碰到了關于閉包的問題,查看資料總結下我眼中的閉包
var price=document.getElementsByTagName('div');
for (var i = 0; i < 6; i++) {
price[i].onClick=function () {
console.log(i)
}
} // 6 6 6 6 6 6
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
先了解下js的執行機制,這里涉及了JS中單執行緒的概念,由于JS是單執行緒語言,不存在并發執行的任務,所有任務都需要排隊,前一個任務結束,才會開始下一個任務,因此,在JS中,任務分為兩種,一是同步任務,一是異步任務,而for回圈就是同步任務,點擊事件函式是異步任務,異步任務會去排隊,排到同步任務的后面(大家猜猜如果幾個異步任務排隊順序是怎樣的),ok !
現在代碼其實可以等于
var price=document.getElementsByTagName('div');
for (var i = 0; i < 6; i++) {
price[i].onClick=order();
}
fnction order(){
console.log(i)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
然后了解什么是閉包,我理解的閉包就是在函式這個作業域里參考作用域之外的量,閉包有個特點就是–基于詞法作用域的查找規則(當前找不到某個變數,就向上查找,如果最終沒有找到,則回傳undefined),
所以,order()中的 i 就成了6,好了,小伙伴們了解了吧
,
</div><div data-report-view="{"mod":"1585297308_001","dest":"https://blog.csdn.net/weixin_44989478/article/details/105594964","extend1":"pc","ab":"new"}"><div></div></div>
<link href=https://www.cnblogs.com/webwjg/p/"https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
