從湯姆大叔的博客裏看到了6個基礎題目:本篇是第2題 - 轉化一個數字數組爲function數組(每一個function都彈出相應的數字)javascript
此題關鍵點:html
一、如何將一個匿名函數存入數組?java
二、如何鎖住須要調用的值?數組
var arr = []; arr[0] = function() { alert('ok'); }
如上,arr[0]即爲一個函數,可用arr[0]()進行調用。下面是初步實現的代碼:閉包
var arr = [9,8,7,6]; function toFunctionArray(arr) { for(var i=0; i<arr.length; i++) { var v = arr[i]; arr[i] = function() { alert( v ); }; } } toFunctionArray(arr); for(var i=0; i<arr.length; i++) { arr[i](); }
以上代碼,看起來沒毛病,可是運行就會發現彈出4次 6。爲什麼會如此?請繼續看解點2函數
在toFunctionArray函數中的for循環會執行4次,循環結束後,v的值是6(第4個元素的值),即轉換後的數組中的每個元素老是alert了同一個v。如何讓每一個函數調用不一樣的v呢?解決這個問題的辦法就是把v的值傳遞給匿名函數,代碼以下:spa
var arr = [9,8,7,6]; function toFunctionArray(arr) { for(var i=0; i<arr.length; i++) { var v = arr[i]; arr[i] = function(v) { alert( v ); //每一個v都保存了不一樣的值 }(v); //注意此處的v做爲匿名函數的參數 } } toFunctionArray(arr); for(var i=0; i<arr.length; i++) { arr[i](); }
若是此處不太明白,請了解javascript變量的做用域、js內存回收機制、閉包等概念。code
-------------------------------------------- 解題完畢的分割線 -------------------------------------------htm
此外,可用數組的forEach來實現,會變得比較直觀,代碼以下:blog
var arr = [9,8,7,6]; function toFunctionArray(arr) { arr.forEach( function(v, i, arr) { arr[i] = function() { alert( v ); } } ); } toFunctionArray(arr); arr.forEach( function(v, i, arr) { arr[i](); } );
關於此法,再也不詳解,此題結束!