閉包只能取得包含函數中任何變數的最後一個值。 “閉包只能取到包含函數中任何變數的最後一個值”得到驗證。因為每個函數的作用域鏈中都保存著createFunctions()函數的活動對象,所以他們引用的是同一個變數i 可以通過創建另一個匿名函數強制讓閉包的行為符合預期。 示例如下: 在重寫了create ...
閉包只能取得包含函數中任何變數的最後一個值。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>閉包與變數</title> 5 </head> 6 <body> 7 <script type="text/javascript"> 8 function createFunctions(){ 9 var result=new Array(); 10 for(var i=0;i<10;i++){ 11 result[i]=function(){ 12 return i; 13 }; 14 } 15 return result; 16 } 17 18 // var data=createFunctions(); 19 // console.log(data);//列印顯示的是函數,如下圖1 20 21 //修改如下則可以顯示函數數組返回的值。如下圖2
var funcArray = createFunctions(); 22 for(var j=0;j<funcArray.length;j++){ 23 console.log("第"+j+"次調用:"+funcArray[j]()); 24 } 25 </script> 26 </body> 27 </html>
“閉包只能取到包含函數中任何變數的最後一個值”得到驗證。因為每個函數的作用域鏈中都保存著createFunctions()函數的活動對象,所以他們引用的是同一個變數i
可以通過創建另一個匿名函數強制讓閉包的行為符合預期。
示例如下:
<!DOCTYPE html> <html> <head> <title>閉包與變數</title> </head> <body> <script type="text/javascript"> function createFunctions(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(num){ return function(){ return num; }; }(i); } return result; } // var data=createFunctions(); // console.log(data); var funcArray = createFunctions(); for(var j=0;j<funcArray.length;j++){ console.log("第"+j+"次調用:"+funcArray[j]()); } </script> </body> </html>
在重寫了createFunctions()函數後,每個函數就會返回各自不同的索引值了。我們沒有直接把閉包函數賦值給數組,而是定義了一個匿名函數,並將立即執行函數的結果賦值給數組(返回的是一個函數)。這裡的匿名函數有一個num參數,也就是最終的函數要返回的值。在調用每個匿名函數時,我們傳入變數i。由於函數參數是按值傳遞,所以就會將變數i的當前值複製給參數num。而在這個匿名函數內部,又創建並返回一個訪問num的閉包。這樣一來,result數組中的每個函數都有自己num變數的一個副本,因此就可以返回各自不同的數值了。
另外:在驗證過程中走彎路的收穫
<!DOCTYPE html> 2 <html> 3 <head> 4 <title>閉包與變數</title> 5 </head> 6 <body> 7 <script type="text/javascript"> 8 function createFunctions(){ 9 var result=new Array(); 10 for(var i=0;i<10;i++){ 11 result[i]=function(){ 12 return i; 13 }();//()執行匿名函數結果賦值給result[i],此時result為數值數組 14 } 15 return result; 16 } 17 18 var data=createFunctions(); 19 console.log(data); //如此輸出的則是相應的I值,因為此時result為數值數組 21 25 </script> 26 </body> 27 </html>
運行結果如下圖:
總結:
學習了閉包只能取得包含函數任何變數的最後一個值。
匿名函數調用。
函數數組。