<script> var severalObj=window.document.getElementsByName("button"); for(var i=0;i<several.length.i++){ severalObj[i].onclick(){ alert(i); } } </script>
通常我們在前端中要為若干個節點添加相同的事件,為了減少代碼量便想出使用上面的代碼對這些節點進行循環綁定事件。然而事情並未像之前預想到的那樣,實驗后會發現無論點擊哪個元素都會彈出several.length,而不是我們之前預想的i。這正是閉包(匿名函數)要使用外部作用於中變量的結果。而卻,這也是由於匿名函數本身無法傳遞參數(故無法維護自己的作用域)造成的。
當函數調用外部變量是就構成一個閉包,里面的變量會受到別的地方影響,所以解決的方式為:構建一個只有該匿名函數本身才可以訪問的閉包,保存只供本身使用的變量。
for(var i=0;i<severalObj.length;i++){ (function(i){ severalObj[i].onclick=function(){......} })(i); }
上面創建了匿名函數,從而構建了一個新的作用域。匿名函數需要傳一個參數,所以在執行的時候需要傳一個參數。也正是通過這個參數維護了中間狀態。