<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>閉包</title>
<style type="text/css"> div { width: 100px; height: 100px; background: lightgreen; float: left; margin: 20px; font: 30px/100px "microsoft yahei"; text-align: center; } </style>
</head>
<body>
<div>a</div>
<div>b</div>
<div>c</div>
<div>d</div>
<div>e</div>
<div>f</div>
<div>g</div>
<div>h</div>
<div>i</div>
<div>j</div>
<script type="text/javascript">
var divs=document.getElementsByTagName("div"); for (var i=0;i<divs.length;i++) { divs[i].onclick=function(){ alert(i); } } </script>
</body>
</html>
運行結果:
點擊每一個div都是10,根本原因是var沒有塊級作用域只有函數作用域,而點擊事件的函數內部使用外部的變量i一直在變化,當我們指定click事件時並沒有保存i的副本
修改代碼,使用閉包:
//方法一 for (var i=0;i<divs.length;i++) { (function(i){ divs[i].onclick=function(){ alert(i); } })(i) } //方法二 for (var i=0;i<$("div").length;i++) { $("div")[i].onclick=(function(n){ return function(){ alert(n); } })(i) }
結果:
總結:
(1)外界無法訪問閉包內部的數據,如果在閉包內聲明變量,外界是無法訪問的,除非閉包主動向外界提供訪問接口;
(2)一般的函數,調用完畢之后,系統自動注銷函數,而對於閉包來說,在外部函數被調用之后,閉包結構依然保存在
(3)使用閉包會占有內存資源,過多的使用閉包會導致內存溢出等.