2017-03-05 64 views
3

工作對高階函數雄辯的Javascript章,我就翻過這個例子:花括號周圍循環改變輸出

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) 
    current = combine(current, array[i]); 
    return current; 
} 

console.log(reduce([1, 2, 3, 4], function(a, b) { 
    return a + b; 
}, 0)); 
// → 10 

其中,當for循環重新編寫,包括我以爲是可選的,大括號,如:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
    } 
} 

console.log(reduce([1, 2, 3, 4], function(a, b) { 
    return a + b; 
}, 0)); 
// → 1 

結果只是1而不是預期的10。什麼是大括號在這裏做什麼來改變輸出?當你問他們的

+1

大括號將'return current;'**在循環體內運行**,所以在第一次迭代中,您退出函數。沒有大括號,'return current;'在**循環體之後是**。 –

回答

5

因爲return語句立即結束函數和循環,所以您需要將return語句移動到for循環的塊之外。

for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
} 
return current; 

function reduce(array, combine, start) { 
 
    var current = start; 
 
    for (var i = 0; i < array.length; i++) { 
 
     current = combine(current, array[i]); 
 
    } 
 
    return current; 
 
} 
 

 
console.log(reduce([1, 2, 3, 4], function(a, b) { 
 
    return a + b; 
 
}, 0));

6

大括號正在這樣做:因爲你列入for循環的return聲明:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
    } 
} 

循環停止短的意圖是什麼,因爲返回退出循環,實際上函數返回一個值,所以只有數組第一個元素的值:1被摺疊到var current並輸出1。鑑於:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    } 
    return current; 
} 

返回預期輸出:10因爲for摺疊返回值之前所有的數組元素。

3

此代碼運行循環一次,第一個週期後立即返回:

for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
} 

在這裏,我們循環後返回完成循環:

for (var i = 0; i < array.length; i++) 
    current = combine(current, array[i]); 
return current;