<div class="codetitle"> <span><a style="CURSOR: pointer" data="61513" class="copybut" id="copybut61513" onclick="doCopy('code61513')"><u>複製程式碼</u></a></span> 代碼如下:</div> <div class="codebody" id="code61513"> <br> <br><br> <br> <br> <br><meta charset="UTF-8"> <br><title>Insert title here</title> <br><script type="text/javascript"> <BR>/* <BR>* 1.js中的變數都是公用的. <BR>2.js中沒有靜態變數<br>3.閉包:函數內部可以呼叫函數外部的變數;反之,則不行<br>*/ <BR> <BR>var r=10; <BR>function test1(){ <BR>var r2="abc"; <BR>//alert(r) <BR>} <BR>//alert(r2);/ /不能存取的函數內部的r2 <BR>test1(); <BR>//嵌套的函數中也ok啦<BR>function test2(num1){ <BR>function test3(num2,num3){ <BR>return num2 num3 num1; <BR>} <BR>return test3(10,20) <BR>} <BR>//alert(test2(30)); <BR>//-------- -循環中的閉包------------------------ <BR>function testfun(){ <BR>var r=1; <BR>var arr=[]; <BR>for(var x=0;x<3;x ){ <BR>r ; <BR>arr[x]=function(){ <BR>return r; <BR>} <BR>} <BR>return arr; <BR>} <BR>alert("testfun:" testfun()); <BR>var arr2=testfun(); <BR>alert("arr:" arr2[0] ); <BR>alert("arr:" arr2[1]()); <BR>alert("arr:" arr2[2]()); <BR>//========= =以上三個彈出框的結果都是4========== <BR>/*分析原因:<BR>理解一下在JavaScript中函數是什麼? <BR>函數就是一段可執行的程式碼區塊,函數也是可以用變數表示,例如函數的第二種定義方式<BR>var add=new Function("a","return a 10");底層的本質就是這個函數名稱指向<BR>了這段為變數而創建的可執行的程式碼。 <BR>* 首先當testfun函數執行完畢以後,arr[0],arr[1],arr[]中都是儲存了相同的<BR>可執行程式碼區塊function(){ <BR>return r <BR>}也就是說上面三個是函數變數而已,要執行它們只需要在變數名稱後面加()就ok了<BR>而且這個時候r的值4 <BR>當執行arr[0]()相當於執行了這個程式碼區塊中的程式碼。 <br>所以最後的結果return r,當然回傳4了。 <br>*/ <BR><BR></script> <br> <br> <br><br> </div>