1
私はそれがこのように振る舞うである理由がわからない以上、まだコードで演奏されている

高階関数の呼び出し奇妙な行動

function myforEach(arr, func){ 
    for(var i=0; i<arr.length; i++){ 
    func(); 
    } 
} 
var arr = [1,2,3]; 

function func2(){ 
return 3+3; 
} 

myforEach(arr, func2); // undefined 

は、私は2つの引数配列と取るmyforEach関数を作成ファンクションは引数funcとして渡されます。これは、forループ内で以下で3回呼び出されます。次に、3 + 3を加算する値を返す関数func2を宣言します。 次に、私は myforEachを2つの引数で実行し、コンソールで3回、値6を出力すると予想しますが、返されるのは未定義です。

私はfunc2の文を変更します。

function func2(){ 
console.log(3+3); 
} 

と私はコンソールが6三回を記録し得るもう一度実行します。 myforEach(arr, func2); // (3)6

その後、私は再びfunc2の文を変更します。私は括弧function func2(){alert;} // undefinedなしfunc2の中に警告を配置しようが、括弧function func2(){alert();}を追加するとき、それは三回

を警告する場合がmyforEach(arr, alert); // (3)alertを試してみた場合

function func2(){ 
console.log("hi"); 
} 

myforEach(arr, func2); // (3)hi 

ですから質問はなぜfunction func2(){return 3+3;}が6回3回戻ってこないのでしょうか? forループの中でfunc()はカッコで囲まれているので、追加された関数が呼び出されるのはなぜですか?func2が正しく呼び出されないのはなぜですか?

私はstackoverflowに関するいくつかの調査を行いましたが、何らかの理由でリターンが失われてしまいましたが、理由と根本原因についてさらに詳しい説明はありませんでした。

私は何かが欠けているのか、あまりにも眠いのか分かりません。どんな説明も役立ちます。ありがとう:)

答えて

2

なぜ関数func2(){return 3 + 3;}が6回3回返されないのですか?

  —あなたはその戻り値で何もしていないだけです。その後、myforEachfunc2を渡すとfuncとしてそれを受けて、しかしだ:

function myforEach(arr, func){ 
    for(var i=0; i<arr.length; i++){ 
    func(); // <=== You're not using the return value for anything 
    } 
} 

をジャスト値を返すことは、それが自動的にどこでも出力されることはありません。

console.log("Nothing gets output after this message"); 
 
var arr = [1,2,3]; 
 
function func2(){ 
 
return 3+3; 
 
} 
 
arr.forEach(func2);

forEachが意図的に当たり障りのないです、それは関数の戻り値と何もしません:これは内蔵のforEach同様の場合であろうと

注意あなたはそれを与える。それはどこでも覚えておらず(map)、それを出力し、他の人と合計してください(それはreduceとなるでしょう)。myforEachも同様です。

+0

になりますが、func2の3 + 3の戻り値によってコンソールに出力される値が期待されていましたが、間違っているようです。 func()が3回呼び出されているので、ループ内のfunc()への戻り値を6回3回出力するかどうかは疑問でしたが、コンソールでは6回だけ出力しています。何らかの理由がありますか? @ T.J。クラウダーありがとうございました。 :) – Alonso

+0

@AlonsoAhmetaj:明示的な戻り値を設定していない関数を呼び出しているため、あなたが入力した最も外側の式の結果を除いて、自動的に何もコンソールに出力されません( 'undefined') )。それを 'return func();'に変更すると、最初のループの繰り返しで 'myforEach'が終了し、6回だけ表示されます。 –

+0

それを共有する気にならないなら、それを3回出力する適切な方法は何でしょうか?私はその上でconsole.logを使っていましたが、私は働いていましたが、その価値を3回返す別の方法かもしれません。それを変数に追加することもできます。ありがとう! – Alonso

0

機能は期待通りに6を返します。その戻り値を格納する手段が必要です。任意の変数にfunc2()という呼び出しを割り当てると、その値は6