var Type = {};
for (var i = 0, type; type = ['String', 'Array', 'Number'][i++];) {
(function (type) {
Type['is' + type] = function (obj) {
return Object.prototype.toString.call(obj)==='[object '+type+']';
}
})(type);
}
console.log(Type.isArray([])); //true
console.log(Type.isString(234)); //false
- 利用闭包我们可以完成很多工作,下面这个比较经典的应用。
- 点击不同的Div会弹出对应的下标
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<script type="text/javascript">
var nodes = document.getElementsByTagName('div');
for (var i = 0; i < nodes.length; i++) {
nodes[i].onclick = function () {
alert(i);
}
}
</script>
- 经过测试你会发现上面的代码随便点击哪个Div都弹出4。这是因为onclick事件是异步触发的,当事件被触发的时候,for循环已经结束,此时的变量 i 已经变为4.
- 解决办法就是用到闭包将循环的i值都封闭起来。如下:
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<script type="text/javascript">
var nodes = document.getElementsByTagName('div');
for (var i = 0; i < nodes.length; i++) {
(function (i) {
nodes[i].onclick = function () {
alert(i);
}
})(i);
}
</script>