2016-05-27 51 views
3

嗨我想學習如何實現回調函數。我的老師多次幫助過我,但我仍然無法通過下面的公式傳遞數據。我試圖讓某些元素的數組被推入一個新的函數,只要他們在函數中通過一個測試。請看看並感謝您的意見。爲什麼我得到一個空陣列和資源來進一步理解的解釋將不勝感激。學生試圖瞭解回調函數

// EACH DEFINITION 
function each (collection, callback) { 
    for(var i = 0; i < collection.length; i ++){ 
    callback(collection[i]); 
    } 
} 


// VARIABLE DECLARATION 
var myArray = [1,2,3,4,5,6]; 
var isEven = function (num) { 
    return num % 2 === 0; 
}; 

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    test(item); 
    }); 
    if(test(array)){ 
     arr.push(array); 

    } 

    return arr; 
} 

// IMPLEMENT INVOCATION 

implement(myArray, isEven); 
+0

你爲什麼要在循環之外推動結果? – ShuberFu

回答

0
// EACH DEFINITION 
function each (collection, callback, results) { 
    for(var i = 0; i < collection.length; i ++){ 
    callback(collection[i]); 
    } 
    console.log(results); 
} 


// VARIABLE DECLARATION 
var myArray = [1,2,3,4,5,6]; 
var isEven = function (num, array) { 
    return num % 2 === 0; 
}; 

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    function filter (item) { 
    if (test(item)) { 
     arr.push(item); 
    } 
    } 
    each(array, filter, arr); 
    // If you return arr here, it will still be empty. You must pass it to functions it is being operated on. 
} 

// IMPLEMENT INVOCATION 

implement(myArray, isEven); 

你不僅試圖將arr推到你的循環之外,而是試圖在獲得任何值之前返回arr。

3

您正在each()環外建設arr

我想你的代碼會是這樣的:

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    if(test(item)) { 
     arr.push(item); 
    } 
    }); 

    return arr; 
} 

儘管在這種情況下,沒有理由爲您implement()過濾功能可言,因爲JavaScript數組原型已經具備了filter方法。你可以簡化你的電話本:

var filteredArray = myArray.filter(isEven); 

雖然你可能也然後想改變你的ISEVEN定義更正確爲:

var isEven = function (num, index, array) { 

你的情況,你不需要有工作最後兩個參數。

+2

是正確的迂腐,但我認爲你的意思是JavaScript不是Java。 – ste2425

+0

@ ste2425的確我在做:) –

0

兩點:

首先,你的回調函數的實現是正確的。就回調的概念而言,您正在調用並正確傳遞函數。

但是,您的implement()函數可能有一個錯誤。你之後each()不推到arr直到已經被稱爲:

function implement(array, test) { // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item) { 
     result = test(item); 
    }); 

    // This block should be in the loop itself 
    // It should also refer to item, not array 
    if (test(array)) { 
     arr.push(array); 
    } 

    return arr; 
} 

嘗試根據您所提供的代碼此修復程序:

// EACH DEFINITION 
 
function each(collection, callback) { 
 
    for (var i = 0; i < collection.length; i++) { 
 
    callback(collection[i]); 
 
    } 
 
} 
 

 

 
// VARIABLE DECLARATION 
 
var myArray = [1, 2, 3, 4, 5, 6]; 
 
var isEven = function(num) { 
 
    return num % 2 === 0; 
 
}; 
 

 
// IMPLEMENT DEFINITION 
 
function implement(array, test) { // array = myArray, test = isEven 
 
    var arr = []; 
 
    each(array, function(item) { 
 
    if (test(item)) { 
 
     arr.push(item) 
 
    } 
 
    }); 
 
    
 
    if (test(array)) { 
 
    arr.push(array); 
 

 
    } 
 

 
    return arr; 
 
} 
 

 
// IMPLEMENT INVOCATION 
 

 
var result = implement(myArray, isEven); 
 
console.log(result); // For snippet results

0

你的回調,如你所定義的,是

function(item){ 
    test(item); 
} 

這隻會在每個item上調用test就是這樣。既然你要採取進一步添加itemarr如果test返回true,你應該把回調內部的檢查代碼,以及,使得它

function(item){ 
    if (test(item)) { 
    arr.push(item); 
    } 
} 

,使這個函數會被每個項目。

而且,這部分

if(test(array)){ 
    arr.push(array); 
} 

不正確,因爲你傳遞一個整個數組到ISEVEN時ISEVEN期待的數字。test(array)將始終返回false;這就是爲什麼你的arr是空的。

修改你的代碼,你想工作,這將是

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    if (test(item)) { 
     arr.push(item); 
    } 
    }); 

    return arr; 
} 

資源明智的,有回調教程廣泛使用的在線,以及最佳實踐。您可以通過Google搜索輕鬆找到最適合您的搜索結果。

0

它看起來像我這裏的整個問題是在你表示的實現部分。所有其他代碼看起來都足夠了。

each(array, function(item){ 
    test(item); 
}); 

好吧,首先讓我們來看看這段代碼。您正在對每個函數進行調用,它將使用此處定義的回調匿名函數,如圖所示。但是,如果您要查看每個函數本身,則不會返回(這意味着它默認返回undefined)。也沒有修改在每個。因此,這組代碼對代碼的執行沒有影響,並且某些高級編譯技術可能實際上被V8引擎在chrome中刪除(如果使用的話)。

這意味着正在執行代碼的唯一方面是

var arr = []; 
if(test(array)){ 
    arr.push(array); 

} 
return arr; 

在這一點上,測試仍然是isEven功能,所以你基本上是問在JavaScript這個

if(array % 2 === 0) arr.push(array); 

陣列在條件語句中使用時表現得有趣,在這種情況下,數組實際上有toString調用它(更深入的這裏:https://stackoverflow.com/a/10556035/1026459,但基本上當你有對象===號碼時,它會嘗試使用toPr對對象產生影響,導致字符串),這使得它是

if("1,2,3" % 2 === 0) 

這是錯誤的。因此arr不變,並返回其原始狀態[]