2016-06-30 8 views
2
function fun(x){ 
    x++; 
    if(x==2){ 
     fun(x); 
    }else { 
     return x; 
    } 
} 
alert(fun(1)); 

警告は「未定義」です。 しかし、私はそれをこのように書いた場合:なぜコードの結果は未定義ですか?

function fun(x){ 
    x++; 
    if(x==2){ 
    fun(x); 
    }else { 
    alert(x); 
    } 

} 
fun(1); 

は、それが3

は、なぜそれが第1の状況では「未定義」ではない3を警告警告が表示されますか?これまで、この...

+4

あなたは 'return fun(x);'が必要です。 – Arg0n

答えて

2

変更をについて混乱:ときx == 2

+0

質問は「なぜ」、「どうすればこの問題を解決するのか」ではありませんでした。説明が役に立ちます。 – mik01aj

+0

@ m01今すぐになりますか? – Arg0n

2

function fun(x){ 
    x++; 
    if(x==2){ 
     return fun(x); 
    } else { 
     return x; 
    } 
} 
alert(fun(1)); //3 

は、そうでなければ、あなたが不足している場合x == 2には、あなたのif文では、関数から任意の値を返すされていませんreturn文です。

これにより、funが未定義になります。

トリックを行う必要があり、このにそれを変更:

function fun(x){ 
    x++; 
    if(x==2){ 
     return fun(x); 
    }else { 
     return x; 
    } 
} 
alert(fun(1)); 
0

あなたがChromeのコンソールにアクセスし、一つ一つのコードの両方を実行する場合は、どちらの場合も「未定義」が返されるのそれを見つけるでしょう。唯一の違いは、あるケースでは関数に警告している場合で、それ以外の場合には実際の値を警告していることです。

アラートには、関数から返された最終値が表示されるため、最初のケースでは未定義が表示されます。この場合、戻り値はelseの部分だけであるため、関数からは何も返されません。したがって、未定義が返されます。

2番目のケースでも同じことが起こっています。これは、あなたが警告の中に最終値が表示されているelse部分に警告があるからです。

0

あなたはGoogle Chromeの開発者コンソールで、次のしよう -

第1ペースト -

function fun(x){ 
    x++; 
    if(x==2){ 
    fun(x); 
    }else { 
    alert(x); 
    } 
} 

を押して、関数を宣言れる入力します。次に、fun(1)を呼び出します。それでもあなたは未定義になります。これは、再帰呼び出しであり、呼び出しスタックの実行順序を維持するために発生します。再帰的な関数呼び出しの値から戻り値が返されますが、関数を再帰的に呼び出すときに使用されるreturnキーワードがないので、undefind値を与えています。

コールスタックはここではリターンキーワードがないのでデフオルト値を引き起こしていると思います。

私がどこか間違っている場合は、あなたの意見を共有してください。

関連する問題