2017-10-12 4 views
0

講師がJavaScriptオブジェクトを再帰的に検索するこの関数を作成しました。JavaScript:スコープがすでにアクセスを許可している場合、checkLeafにパラメータが必要なのはなぜですか?

私の質問は、外isContained関数に渡さleafvalueパラメータの範囲に関する:変数のスコープの私の理解あたり、インナーcheckLeaf機能は、既に外側の関数に渡される変数へのアクセス権を持っています。これは、leafvalueの両方の変数がcheckLeaf関数内でアクセスされることを観察すると自明である。

なぜ、leafからcheckLeafに渡す必要がありますか?さらに、パラメータを渡す必要がある場合は、なぜleafで、valueではないのですか?どちらも明らかに内部関数からアクセスされていますか?

const isContained = function(leaf, value) { 
    function checkLeaf(leaf) { 

    if (leaf.value === value) { 
     return true; 
    } 
    if (leaf.left && leaf.value > value) { 
     return checkLeaf(leaf.left); 
    } 
    if (leaf.right) return checkLeaf(leaf.right); 
    return checkLeaf(leaf); 
    } 
} 

isContained(binarySearchTree, 6); 
+1

リーフが変更されるため、必ずしも外部関数に渡される値ではありません。 –

+0

これは再帰と関係がありますか? –

+0

ああ、リーフの値はバイナリツリーを検索するときに変更されますが、(value)の値は検索されません。 –

答えて

1

leafそれはcheckLeafはその再帰呼び出しスタックを通過しながら、変化する唯一の変数であるため、内部機能checkLeafに渡される唯一の変数です。変数valueは、検索対象のまま変更されないため、checkLeaf関数に渡す必要はありません。

+1

"*変数値は変更されません*"という書式がないと、変数 "leaf"の値として誤解される可能性があります。 – Bergi

関連する問題