0

alg() 関数で //fn のコメントを外してコードを実行すると、0 が返されなくなります。このエラーの原因は何ですか?? 別の関数定義内で関数を複数回呼び出すことはできませんか?

<!DOCTYPE html>
<html>

<script>
function factorial(b)
{
factorial=1;
for(b; b > 1; b--)
{
factorial =b*factorial;
}
return factorial;
}
function alg(n, k)
{


 fk = factorial(k);
 //fn=factorial(n);


return 0;


}


</script>


<body>
<script>
write=alg(5,2);

document.write(write);
</script>

4

2 に答える 2

1

問題は、factorial明らかに関数内のローカル変数であるはずの variable が、ローカル変数factorial()として宣言されていないことです。var修正は、キーワードを使用して宣言するだけです。

function factorial(b)
{
    var factorial=1;
    for(b; b > 1; b--)
    {
        factorial =b*factorial;
    }
    return factorial;
}

関数factorialのスコープ内でローカル変数として を宣言しないと、スクリプトの最上位の構文で宣言されているため、グローバル スコープを持つ関数オブジェクトを参照するだけです。factorial()factorialfactorial()function factorial(){...}

そのため、内部のコードfactorial()がこのfactorial参照を変更して数値を指すようにすると、グローバル変数が関数ではなく数値を指すようfactorial()になるため、2 番目の呼び出しは失敗します。factorialfactorial()

グローバル変数は、javascriptの悪い部分の1 つと広く考えられています。これはその理由の良い例です。

アップデート

明確にするために、この問題は厳密にグローバル変数に限定されているわけではなく、関数名のスコープの一般的な問題です。その名前のように関数が宣言されている場合function name(){...}、関数とその親内にスコープがあります。ここでは、親コンテキストがたまたまグローバル コンテキストになっているだけです。

于 2012-12-29T20:15:20.340 に答える
0

「function factorial(b)」の変数 factorial を factorial1 などの別のものに変更するだけです。変数名が関数名と競合しています

    function factorial(b)
{
factorial1=1;
for(b; b > 1; b--)
{
factorial1 =b*factorial1;
}
return factorial1;
}
于 2012-12-29T06:22:57.920 に答える