2017-08-22 5 views
0

私はEloquent Javascriptを読んでいます。このスクリプトは理解できません。 ここからの値はfromMotherおよびfromFatherからです。 私はstackoverflowの中でこのことについて、検索、私が見つけたが、それは私がこのスクリプトEloquent Javascript anchestry DNAスクリプト

Anchestry array

とスクリプトを理解する助けにはならなかった。

byName={}; 
    function reduceAncestors(person, f, defaultValue) { 
     function valueFor(person) { 
     if (person == null) 
      return defaultValue; 
     else 

      return f(person, valueFor(byName[person.mother]), 
          valueFor(byName[person.father])); 
     } 
     return valueFor(person); 
    } 

    function forEach (array,action) { 
     for (var i = 0; i < array.length; i++) { 
      action(array[i]); 
     } 
    } 


    forEach(ANCESTRY_FILE,function (person) { 
     byName[person.name]=person; 
    }) 


    function sharedDNA(person, fromMother, fromFather) { 
     if (person.name == "Pauwels van Haverbeke") 
     return 1; 
     else 

     return (fromMother + fromFather)/2; 
    } 
    var ph = byName["Philibert Haverbeke"]; 
    console.log(reduceAncestors(ph, sharedDNA, 0)/4); 
+0

私は 'debugger;'と 'console.log()'の文を混在させ、ブラウザコンソールのデバッグモードでステップバイステップで実行することを本当に知りたければ、 - ソースで単一のレコードを使用するのは良い考えかもしれませんが、デバッグ時に混乱は少なくなります。 – Nope

+0

このコードには多数の関数定義が含まれています。例えば ​​'sharedDNA'は' person'、 'fromMother'、' fromFather'の3つのパラメータを取る関数として定義されています。この関数を呼び出すコードまでは、パラメータの値を決定して関数に渡します。これはコード全体ですか? – tommyO

答えて

0

他の人が述べたように、デバッガでコードを実行しているがしますそれを理解する最善の方法である。ただし、基本的な説明は次のとおりです。

fromMotherfromFatherは、sharedDNA関数の引数です。 sharedDNA関数は、スクリプトの最後の行のreduceAncestors関数の引数として渡されます。reduceAncestors関数の内部

console.log(reduceAncestors(ph, sharedDNA, 0)/4); 

sharedDNAfと呼ばれています。これは、この行に呼び出されます

return f(person, valueFor(byName[person.mother]), 
          valueFor(byName[person.father])); 

Soは、最終的には、fromMotherfromFatherの値は、上記の行でvalueFor機能には、2つの呼び出しによって返された値が移入されています。