peterhpchen
10/19/2017 - 11:57 AM

Pre-Test Question 4

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了, 這樣ifunction(x){ return x +i; }就會形成閉包。