JS中所有的function都是一個閉包,不過一般來說,嵌套的function所產生的閉包更為強大,也是大部分時候我們所謂的閉包。 我們可以把閉包理解為定義在一個函數內的函數。 當點擊一個節點時,按照預期,應該彈出節點的序號,但實際彈出的是-1. 函數在執行的時候才初始化活動對象,當第一個函數執行時 ...
JS中所有的function都是一個閉包,不過一般來說,嵌套的function所產生的閉包更為強大,也是大部分時候我們所謂的閉包。
我們可以把閉包理解為定義在一個函數內的函數。
//錯誤的代碼 function test(nodes){ for(var i=nodes.length-1;i>=0;i--){ nodes[i].onclick=function(){ alert(i); } } }
當點擊一個節點時,按照預期,應該彈出節點的序號,但實際彈出的是-1.
函數在執行的時候才初始化活動對象,當第一個函數執行時,i的值已經是-1了。使用立即執行的匿名函數,就會生成一個僅對該函數有效的變數 。
在閉包(這裡就是匿名函數)裡面定義的函數(這裡是指事件處理函數)會「記住」它所處的上下文(這是指匿名函數中所有的變數)環境。
//改正後的代碼
//方法1 function test(nodes){ for(var i=nodes.length-1;i>=0;i--){ (function(i){ nodes[i].onclick=function(){ alert(i); } }(i)) } }
//方法2 function test(nodes){ function helper(i){ return function(){ alert(i); } } for(var i=nodes.length-1;i>=0;i--){ nodes[i].onclick=helper(i); } }
擴展閱讀:JavaScript中(function(){…})(); 與 (function(){…}()); 這兩種寫法在意義上有什麼區別?