2016-04-16 11 views
0

JavaScriptを学習していて、次の演習とちょっと混乱しました。ソート方法として別の機能を受け入れるフィルタを作成しなければならなかった。私がちょっと理解できないことは、for loopvalueを正確にxに渡すことです。説明していただけますか?外部関数(配列)からのリターン関数(x)の理解

function filter(arr, func) { 

    var result = []; 

    for (var i = 0; i < arr.length; i++) { 

     var value = arr[i]; 
     if (func(value)) { 
      result.push(value); 
     } 
    } 

    return result 

} 

function inBetween(a, b) { 
    return function(x) { 
     return a <= x && x <= b; 
    } 
} 

function inArray(arr) { 
    return function(x) { 
     console.log(x) 
     return arr.indexOf(x) != -1; 
    } 
} 

var arr = [1, 2, 3, 4, 5, 6, 7]; 

alert(filter(arr, function(a) { 
    return a % 2 == 0 
})); // 2,4,6 

alert(filter(arr, inBetween(3, 6))); // 3,4,5,6 

alert(filter(arr, inArray([1, 2, 10]))); // 1,2 
+0

'if(func(value))'では、値が関数に渡されます。 'func(value)'は関数呼び出しです。しかし、それが何を求めているのかははっきりしていません。 – Pointy

+0

@Pointy私は、例えばinBetween(a、b)のようなプリセット属性を持つ関数を渡すのは混乱していますが、同時にforループではfunc(value)ですので、インナーリターン関数に行きます。 – Adrian

+0

@Trincotには以下の説明があります。 'inArray'や' inBetween'のように関数が別の関数を返すとき、返された関数はそれが作られたコンテキストを "覚えている"。これは単なる普通の関数ですが、 'arr'パラメータのように、作成された環境からのものへのアクセスを保持します。そうでなければ、それは他のどの機能とも変わりません。 – Pointy

答えて

1

私は、一例として、このラインを取るよ:

filter(arr, inArray([1, 2, 10]))); 

InArrayバリarr = [1, 2, 10]と呼ばれています。

それはARRその特定のために、以下の(匿名)関数を返します。

function (x) { 
    return arr.indexOf(x) != -1; 
} 

だから、元の行は、今のように描写することができます。今すぐフィルタが呼び出され

filter(arr, function (x) { 
    return [1, 2, 10].indexOf(x) != -1; 
}); 

funcがその匿名関数に設定されています。次のコードは、その関数を呼び出します。

if (func(value)) { 
     result.push(value); 
    } 

このFUNCが呼び出されたときに、これは本当に上記の匿名関数が呼び出され、パラメータXをした瞬間にに設定されます意味しますコール。それは他の関数呼び出しと同じように、関数のパラメータは実際の呼び出しで引数の値を取得します。この行で

1

フィルタ機能は、フィルタリングする配列とフィルタリングを行う機能を受け入れます。この部分では:例えば、私たちはこれですinBetween(3, 6)機能、を見て、場合

for (var i = 0; i < arr.length; i++) { 

    var value = arr[i]; 
    if (func(value)) { //here, you invoke the function on the array's values 
     result.push(value); 
    } 
} 

ので:あなたはこの部分を理解していない場合は

return function(x) { 
    return 3 <= x && x <= 6; 
} 

(約いくつかの続きを読むClosures

だから今、その関数は、単に値を受け入れ、それが3 の間だか否かの真/偽を返す関数であります上記の関数を使用して、配列の各値(1、2、3 ... 7)の呼び出しを最終的に取得します。

他のすべての機能は同じです。

0

filter(arr, inBetween(3, 6))

あなたは "機能を渡し" が、関数呼び出しから結果を渡していません。結果は別の(匿名/名前のない)関数です。このラインから

function filter(arr, func) {

我々はfilterに引数として渡された関数に名前を知っているが、その後、funcという名前:

if (func(value)) {

は、この関数を実行します。

JavaScriptでは、関数は他のオブジェクトと同様のオブジェクトに過ぎません。 「関数オブジェクト参照」と「関数呼び出し」を区別するために、()を検索することができます。

inBetweenは、関数オブジェクト参照です。inBetween(x, y)は、この関数を呼び出すことを意味します。

匿名関数を定義し、変数に代入して引数として渡すことができます。

function() { 
    alert("called!"); 
}(); 

これはJavaScriptを初めて使う人にはエキゾチックに見えるかもしれません。

+0

この説明にはありがとうございます。でも、私はまだ一つのことを知りません。私は状況をどのように見せてくれるかを見せてくれますし、時間があると私が間違っている理由を修正してください:) https://fiddle.jshell.net/cdbs6ohm/1/ 私は値が引数として追加されることを期待しています[ 2]を呼び出す。そして、x引数がどのように字句環境に現れるかを調べることはできません。 – Adrian

+0

あなたが与えたフィディルドは構文が間違っています。あなたはそれを編集して、理解していない部分を指摘するためにコメントを使うことができるので、私はそれをよりよく説明しようとすることができます。 – Dai

+0

私はコードにいくつかのコメントを追加しました、コードは動作しません、私は本当に理解していないものは、ロジックです:) https://fiddle.jshell.net/cdbs6ohm/4/ – Adrian

関連する問題