2017-08-25 5 views
0

だから私は説明や2読書にもかかわらず、私を混乱されているコードの一部で探しています:関数式を離れて取る - 数行に苦しん/パラメータ

ここ

コードだが...

var puzzlers = [ 
    function (a) { return 8*a - 10; }, 
    function (a) { return (a-3) * (a-3) * (a-3); }, 
    function (a) { return a * a + 4; }, 
    function (a) { return a % 5; } 
]; 

var start = 2; 

var applyAndEmpty = function (input, queue) { 
    var length = queue.length; 
    for (var i = 0; i < length; i++) { 
    input = queue.shift()(input); 
    } 
    return input; 
}; 

alert(applyAndEmpty(start, puzzlers)); 
内訳は素晴らしいことだ、私はそれの最も理解

しかし、本当に私はこのラインinput = queue.shift()(input);私は結果を格納するための入力を使用しています知っているが、なぜの始まりと終わりであるboggles何?最後に入力パラメータがあるのはなぜですか

PSこの行alert(applyAndEmpty(start, puzzlers));私は関数を呼び出し、それを警告することを知っています。なぜ私は警告/コンソールログなどの機能を呼び出す必要がありますか?これはIIFEではないので、関数が呼び出されるまで実際に警告することはありませんか?その「オン」ボタンのように?

申し訳ありませんが、これは長いです、事前に感謝!

+0

'queue'が配列され、そして' shift'関数であることを起こるれ、その配列の最初の項目を返し、関数は '(引数)' – adeneo

+0

機能と呼ばれています彼らが呼び出されるまで何もしないでください。 IIFEはすぐに関数を呼び出しますが、名前付き関数は一般に一度定義されるため、異なる入力で繰り返し呼び出すことができます。 – Barmar

答えて

1

わかりやすくするために、forループのコードを少し編集しました。

// This array contains 5 items, each item is a function which takes a single param and returns a number. 
 
var puzzlers = [ 
 
    function (a) { return 8*a - 10; }, 
 
    function (a) { return (a-3) * (a-3) * (a-3); }, 
 
    function (a) { return a * a + 4; }, 
 
    function (a) { return a % 5; } 
 
]; 
 

 
// The start value is 2. 
 
var start = 2; 
 

 
var applyAndEmpty = function (input, queue) { 
 
    // Get the number of items in the queue. 
 
    var length = queue.length; 
 
    // Iterate over all the items in the queue. 
 
    for (var i = 0; i < length; i++) { 
 
    // Remove the item at index 0 from the queue, the item is stored in the var. 
 
    var itemMethod = queue.shift(); 
 
    // Execute the method, pass it the current value as input param. The result 
 
    // of the method will be placed back into the input variable. 
 
    input = itemMethod(input); 
 
    } 
 
    // Return the modified input value. 
 
    return input; 
 
}; 
 

 
// Runs the applyAndEmpty method and shows the output in an alert. 
 
alert(applyAndEmpty(start, puzzlers)); 
 

 
// The breakdown of the for loop: 
 
// i = 0, input = 2 -> return 8 * 2 - 10 = 6 
 
// i = 1, input = 6 -> return (6-3) * (6-3) * (6-3) = 27 
 
// i = 2, input = 27 -> return 27 * 27 + 4 = 733 
 
// i = 3, input = 733 -> return 733 % 5 = 3 
 
// And thus the alert says three.

あなたが戻ってinputに電流itemMethodの結果を配置していない場合、それはあなたが値2puzzlersから各メソッドを呼び出します。入力変数が決して変更されないので、applyAndEmptyの結果はもはや3でなく2になります。したがって、パズルメソッドを呼び出す結果を保存しない場合は、それらをすべてスキップして、入力パラメータをただちに返すこともできます。

+0

ちょっとThijs、返信いただき、ありがとうございます!私はちょうど今疑問に思っています。 'for'ループは、キュー上で実行されていて入力ではないことをどのように知っていますか? @ Thhs –

+0

あなたは大歓迎です!あなたはあなたの質問を言い換えることができますか?私はあなたが知りたいことが何であるか分かりません。 – Thijs

+0

'//キュー内のすべての項目を繰り返します。for(var i = 0; i

0

これは、最初の関数の結果が2番目の関数に渡され、2番目の関数の結果が3番目の関数に渡されるように、配列内の関数を連結する単なる方法です。

f = [ a => 8 * a - 10, 
 
     a => (a-3) * (a-3) * (a-3), 
 
     a => a * a + 4, 
 
     a => a % 5 ] 
 

 
console.log(f[3](f[2](f[1](f[0](2)))))    // 3 
 

 
console.log(f.pop()(f.pop()(f.pop()(f.pop()(2))))) // 3 
 

 
console.log((a => a % 5)((a => a * a + 4)((a => (a-3) * (a-3) * (a-3))((a => 8*a - 10)(2))))) // 3

関連する問題