看到一篇关于闭包的文章javascript的闭包司徒正美的,里面最后有这么一段代码看不懂
var els = document.getElementsByTagName("li");
(''+Array(els.length+1)).replace(/./g,function(a,i){
els[i].onclick=function(){alert(i)}
})
html代码是这个
<ul>
<li id="a1">aa</li>
<li id="a2">aa</li>
<li id="a3">aa</li>
</ul>
这种写法非常诡异,只能说是一种搞怪写法。
给你解释解释,只能听听,正常情况下别这么用。
首先 Array(els.length + 1) 就产生了 li 数量 + 1 个元素的数组,在数组 toString 的过程中,就会形成一个和 li 数量相等长度字符串(Array.toString() 的 格式是 元素逐个打印,元素间 , 逗号分割,由于这个数组元素都为空,所有只输出了中间分割的逗号,逗号的数量时 els.length + 1 再 - 1 刚好时 li 的数量)。
然后用 replace 查找替换,因为匹配条件 /./g 刚好匹配了字符串中的每一个字符,其实也就匹配了 li 的数量那么多次,在匹配回调的过程中,也就把 function(a, i) 执行了 li 的数量那么多次,然后在回调中对每个 li 进行事件绑定。
这种写法非常花哨,看样子是为了展示闭包而写的。