1 //參考《JavaScript高級程序設計》的典型方法 2 function makeClosures(arr, fn) { 3 var result = new Array(); 4 for(var i=0;i<arr.length;i++){ 5 result[i] = function(num){ 6 return function(){ 7 return fn(num); 8 9 } 10 }(arr[i]); 11 } 12 return result; 13 } 14 15 //使用ES5的bind()方法 16 function makeClosures(arr, fn) { 17 var result = new Array(); 18 for(var i=0;i<arr.length;i++){ 19 result[i] = fn.bind(null,arr[i]); 20 } 21 return result; 22 } 23 24 //使用forEach() 25 function makeClosures(arr, fn) { 26 var result = new Array(); 27 arr.forEach(function(curr){ 28 result.push(function(){return fn(curr)}); 29 }) 30 return result; 31 } 32 33 //使用let 34 function makeClosures(arr, fn) { 35 var result = new Array(); 36 for(let i=0;i<arr.length;i++){ 37 result[i] = function(){ 38 return fn(arr[i]); //let聲明的變量只在let所在代碼塊內有效,所以每次循環的i都是一個新的變量 39 }; 40 } 41 return result; 42 }