亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么閉包可以解決js中循環綁定事件的問題?

為什么閉包可以解決js中循環綁定事件的問題?

侃侃爾雅 2018-09-20 10:10:19
今天遇到了利用循環給元素綁定事件的問題,相信大家應該都遇到過這個問題。我的代碼var hint = ["必填,長度為4-18個字符", "", "再次輸入相同密碼", "格式: [email protected]", ""];    var inputIDs = ["ip-name", "ip-pwd", "ip-pwd-cfm", "ip-email", "ip-phone"];    for (var i = 0; i<hint.length; i++) {        document.getElementById(inputIDs[i]).addEventListener("focus", function (e) {            var tar = e.target.parentElement.getElementsByClassName("alert")[0];            tar.innerHTML = hint[i];        });    }    下面這段代碼用閉包來解決的,但是我沒看懂,為什么這樣調用不會調用到循環結束時i的值了呢?沒有理解這里閉包的用法,有哪位可以解釋一下嗎?for (var i = 0; i < 5; i++) {     var a = function(v){        return function(){            console.log(v)        }    }    document.body.addEventListener('click',a(i))}
查看完整描述

1 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

如果你不使用閉包,你引用的i就是全局作用域(看你的代碼沒有在一個函數里)里的i。document.getElementById(inputIDs[i])這里的i就是你綁定時候的i,但是當你調用綁定的事件的時候函數體里的i就不再是綁定時候的i而是循環執行完以后的i的值了,其實你能訪問到循環執行完了的i的值也有點類似于閉包,函數執行完了,你還能訪問還是里聲明的變量。
但是你使用了閉包就不一樣了,document.body.addEventListener('click',a(i))這里把i以參數的形式傳入a函數,這時候已經和循環里的i不一樣了,他們指向了不同的地址只是值一樣,如果這里你傳入的參數是個對象類型,閉包函數里的參數就是你這個對象的引用的copy,你在循環下面修改了傳入對象的屬性,閉包函數里也會相應修改,但是修改對象的引用的話,閉包里則不會改變。

查看完整回答
反對 回復 2018-10-01
  • 1 回答
  • 0 關注
  • 740 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號