對于以下使用加法賦值的函式,ans當傳遞大于 1 的整數時, 的值始終更改為 1
let ans = 0;
function reduce(num){
if(num == 0){
return 0;
}
ans = reduce(num-1);
return 1;
}
reduce(5);
console.log(ans); // 1
但是當我首先將遞回結果保存到另一個變數時,該函式作業正常(ans將更改為num-1)
let ans = 0;
function reduce(num){
if(num == 0){
return 0;
}
let tmp=reduce(num-1);
ans = tmp;
return 1;
}
reduce(5);
console.log(ans); // 4
這是怎么發生的?這是 Javascript 的功能還是環境中的錯誤?
我嘗試過類似的 C 代碼,它們的行為都相同
#include<stdio.h>
int reduce(int num);
int ans;
int main(){
ans = 0;
reduce(5);
printf("%d",ans); // 4
}
int reduce(int num){
if(num == 0){
return 0;
}
int tmp=reduce(num-1);
ans = tmp;
// ans = reduce(num-1);
return 1;
}
環境:
- 微軟邊緣 97.0.1072.55
- JavaScript V8 9.7.106.18
uj5u.com熱心網友回復:
發生這種情況是因為在 JavaScriptans = reduce(num-1)中被評估為:
ans = ans reduce(num-1)
而不是:
ans = reduce(num-1) ans;
(參見(13.15.2) 運行時語意: ECMAScript 規范中的評估)。
所以在遞回呼叫之前ans被評估,并且它是用作加法運算元的評估值。
您可以通過避免使用具有副作用的函式來避免此類意外行為。一個純粹的遞回解決方案是:
function reduce(num) {
if (num < 2) {
return 0;
}
return reduce(num-1) 1;
}
let ans = reduce(5);
console.log(ans); // 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411298.html
標籤:
