Pre-Test Question 4
function createArrayOfFunctions(y) {
var arr = [];
for (var i = 0; i < y; i++) {
arr[i] = function (x) { return x + i; }
}
return arr;
}
因為沒有閉包, 使得function(x) {return x + i; }
中的i會是迴圈中的最後一個值。
會發生這樣的原因是因為JavaScript在自己的scope內找不到變數的話會往外面的scope去找, 而在我們初始完陣列後, 迴圈的i就跑到了5的位置, 因此我們在這時去呼叫這個這個function的話, 不管呼叫陣列中的哪個Function, 我們得到的i都會是陣列數。
function createArrayOfFunctions(y) {
var arr = [];
for (var i = 0; i < y; i++) {
arr[i] = (function (i) {
return function (x) { return x + i; }
})(i);
}
return arr;
}
解法為多包一層(function(i){})(i)
。
JavaScript在自己的scope中抓不到i時, 會往上一層的scope抓, 因為我們加了一層, 所以這次他就會抓到我們新加的那一層所給的i, 就不會再往外面抓到迴圈完成後的i了, 這樣i
跟function(x){ return x +i; }
就會形成閉包。