闭包的应用
循环绑定事件
闭包的方式
var body = document.querySelector('body'),
buttons = document.querySelectorAll('button'),
arr = ['red', 'green', 'blue']
// 方法1
for (var i = 0
buttons[i].onclick = (function (i) {
return function anonymous() {
body.style.background = arr[i]
}
})(i)
}
// 方法2
for (let i = 0
buttons[i].onclick = function () {
body.style.background = arr[i]
}
}
使用中间变量方式
var body = document.querySelector('body'),
buttons = document.querySelectorAll('button'),
arr = ['red', 'green', 'blue']
for (var i = 0
var item = buttons[i]
item.myIndex = i
item.onclick = function () {
// this => 当前点击的这个按钮
body.style.background = arr[this.myIndex]
}
}
使用事件委托
// 基于事件委托实现多元素的事件绑定,要比传统循环一个个的给元素进行事件绑定,性能提高40%~60%
document.body.onclick = function (ev) {
var target = ev.target
if (target.tagName === "BUTTON") {
// this -> body
this.style.background = target.value
}
}