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>