2016-05-18 10 views
0

私は本を読んで、Javascriptを学ぶためにEloquentを読んでいます。私はこの例に遭遇しましたjavascriptの高次関数

function unless(test, then) { 
    if (!test) then(); 
} 

function repeat(times, body) { 
    for (var i = 0; i < times ; i++) body(i); 
} 

repeat(3, function (n) { 
    unless(n % 2, function() { 
     console.log(n, " is even "); 
    }); 
}); 

// → 0 is even 
// → 2 is even 

私は関数が引数として渡され、互いに内部にある可能性があることを知っています。 then()body()の機能はありますか?それらはどこに定義されていますか? nの値は何ですか?

+0

'then'と' body'は引数に与えられた名前です。コードはそれらが関数であると想定しています(あなたが何か他のものを渡すと劇的に失敗します)。この場合、関数は*関数なので、うまく動作します。それらは、* call *自体の引数リストで定義されています。 –

+0

nの値は何ですか?彼らが "function(n)"を宣言している場合、名前を持つはずの関数ではありませんか?そうでない場合のパラメータと同じ! –

+0

* "nの値は何ですか?" *関数に渡されるものは何でも。関数が呼び出される場所を見てください。 * "関数は名前を持つはずの関数ではありません" *関数は名前を持つ必要はありません。関数を渡すと、パラメータの働きは突然変化しません。最も単純な例: 'function foo(n){console.log(n);} }; foo(5); foo(function(){}); '最初の呼び出しでは、 'n'は値 '5'を、2番目の呼び出しでは' n'は関数を参照します。 –

答えて

0

ここで少し説明します。

function unless (test , then) { 
    if (! test) then() ; 
} 
function repeat (times , body) { 
    for (var i = 0; i < times ; i ++) body (i) ; 
} 

// in here you also pass 2 params to repeat. 
// 3 and an anonymous function, the function is the argument 'body' in repeat 
repeat (3 , function (n) { 
    // as you can see here - you pass 2 params to unless, 
    // 1 is the result of n %2, and an anonymous function, the function is the argument 
    // "then" in unless. 
    unless (n % 2 , function() { 
    console . log (n , " is even ") ; 

    }) ; 
}) ; 

nの値は0から3それに変化しているが、そのあなたの初心者以来、私はものをテストするためにhttps://jsfiddle.net/を使用することをお勧めしまた0,1,2

になるだろう。あなたの例では

0

ここにあなたがunless機能の署名を持っている:

function unless (test , then) { 
// code here 
} 

テスト両方、その後はあなたがunless

を呼び出すときに渡す引数に応じて、パラメータと変更と呼ばれています

たとえば、

は内部テストが関数原因 テストunless

// unless(test,then) => unless(first,second) 
//   |  |    |  | 
//   |-----|---------------  |  
//    ------------------------| 
+1

ありがとうございました:D –

3

を呼び出すときが第二の機能に置き換えられ、その後最初の関数に置き換えられている場合を除きことを意味しますがthen()body()は機能していますか?

thenおよびbodyはパラメータである。値はunlessrepeatに渡される値によって異なります。したがって、値が何であるか(つまり、関数であるかどうか)を判断するには、unlessrepeatが呼び出され、どの値がそれらに渡されるかを調べる必要があります。

一般にrepeatunlessは複数回呼び出すことができます。 thenbodyの値は、関数呼び出しごとに異なる場合がありますが、関数が期待する型(数値、文字列、関数、...)でなければなりません。そうでなければ正しく動作しません。

ここでそれらは定義されていますか?あなたの例では

repeatunlessはここに呼ばれています。

repeat(3, function (n) { 
    unless(n % 2, function() { 
     document.write(n + " is even<br>"); 
    }); 
}); 

あなたがrepeatunlessに渡された第二引数が実際に機能していることがわかります。

nの値は何ですか?

機能が呼び出される場所を見てみましょう。この関数は第2引数としてrepeatに渡されます。 repeatbodyを使用して2番目の引数を参照し、それをループでbody(i)と呼びます。 iの値は0times - 1になります。 timesrepeatに渡された最初の引数で、例では3です。したがって、関数は複数回(3回)呼び出され、0,1および2の値を受け取ります。

+0

他の言語に精通していて、匿名の機能として "身体"と "その時"を補完しているかもしれません。とにかく、upvote、よく説明され、opの質問にはっきりと答えます。 – briosheje

関連する問題