2016-05-27 2 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が値を取得する前に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; 
} 

けれどもこの場合はjavascript配列のプロトタイプはすでにfilterメソッドを持っているので、あなたのimplement()フィルタリング機能のための理由は、すべてではありません。あなたも、より正確であるためにあなたのISEVENの定義を変更する場合がありますけれどもとして

var filteredArray = myArray.filter(isEven); 

:あなたはこれをあなたの呼び出しを簡素化することができ、あなたのケースで

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

あなたが作業する必要はありません。最後の2つのパラメータ

+2

正しいペタンティックですが、私はあなたがJavaScriptでないことを意味すると思います。 – ste2425

+0

@ ste2425確かに私は:) –

0

2点:

まず、コールバック関数の実装が正しいです。コールバックの概念が進む限り、関数を正しく呼び出して渡しています。

ただし、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と表示されています。それだけです。あなたはさらにそれを取るとtestあればリターンが真arritemを追加したいので、あなたはこの関数は項目ごとに呼び出されるように、それ

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

作るだけでなく、コールバック内のコードをチェックすることを置く必要があります。 ISEVENは番号を期待しているときにISEVENに配列全体を渡しているので、

はまた、この部分

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

が正しくありません。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; 
} 

資源が賢明だろう、コールバックがあり、オンラインで広く利用可能なチュートリアルだけでなく、ベストプラクティス。グーグルであなたに最も適したものを簡単に見つけることができます。

0

ここで問題全体があなたが示す実装セクションにあるように見えます。他のコードはすべて適切に見えます。

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

さてさて、最初のコードのこの部分を調べてみましょう。ここで示すようにここで定義されたコールバック無名関数を使用する各関数を呼び出しています。

しかし、各関数自体を見ると、戻り値はありません(つまり、デフォルトでは未定義を返します)。それぞれに変更はありません。その結果、このコードセットはコードの実行に影響を与えません。また、特定の高度なコンパイル手法は、実際に使用されていた場合、V8エンジンによってクロムで削除される可能性があります。

これが実行されているあなたのコードの唯一の側面は、この時点で

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

} 
return arr; 

であることを意味しますが、基本的にJavaScriptでこの

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

配列を求めているので、テストは、まだisEven機能です興味深いことに、条件文で使用されたときに動作します。この状況では、配列には本質的にtoStringが呼び出されます(詳細はhttps://stackoverflow.com/a/10556035/1026459ですが、オブジェクト=== numberの場合はtoPr文字列になるオブジェクトに不等号を付ける)、これはfalseになります。その結果、arrは変更されず、元の状態は[]で返されます。

関連する問題