2014-10-03 87 views
0

我已經構建了這個簡單的遞歸函數。JavaScript通過引用問題傳遞數字,簡單的遞歸函數

遞歸很容易看到,因爲它應該繪製一個像嵌套模式的框。這些盒子每次迭代都會略微向下移動,以便在有重疊線條的地方更清晰。

___________ 
1. |   | 
    |   | 
    |   | 
    |   | 
    |   | 
    |___________| 

    ___________ 
2. |___________| 
    |  |  | 
    |  |  | 
    |  |  | 
    |  |  | 
    |_____|_____| 
    |_____|_____| 

    __ __ __ __ 
3. |___________| 
    |_____|_____| 
    | | | | | 
    | | | | | 
    | | | | | 
    |__|__|__|__| 
    |__|__|__|__| 
    |__|__|__|__| 

http://codepen.io/alan2here/pen/reFwo

var canvas = document.getElementById('canvas').getContext('2d'); 

box(50, 50, 150, 150); 

function box(x, y, width, height) { 
    // draw the box 
    line(x, y, x + width, y); 
    line(x, y, x, y + height); 
    line(x, y + height, x + width, y + height); 
    line(x + width, y, x + width, y + height); 

    // continue with a tree like nested pattern of sub-boxes inside this one. 
    if (width > 100) { 
     width2 = width * 0.5; 
     box(x, y + 5, width2, height); 
     box(x + width2, y + 5, width2, height); 
    } 
} 

function line(x, y, x2, y2) { 
    canvas.beginPath(); 
    canvas.moveTo(x, y); 
    canvas.lineTo(x2, y2); 
    canvas.closePath(); 
    canvas.stroke(); 
} 

然而,這種突然停止工作在迭代3,如可如果width > 100可以看出改變爲width > 50

__ __ __ __ 
3. |_____  | 
    |__|__|  | 
    | | |  | 
    | | |  | 
    | | |  | 
    |__|__|_____| 
    |__|__| 
    |__|__| 

看來,如果值可以得到通過參考,他們不應該是過去了,但是我想通過複製值傳遞的JS數字,更重要的是我創建的大部分傳遞的值從從頭開始,例如..., x + width, ...width2 = width * 0.5

爲什麼程序無法正常工作。


感謝Benni的輕微更正。

回答

2

變量總是在Javascript中值傳遞。它甚至不支持通過引用傳遞參數。

的問題是,您使用的是全局變量:

width2 = width * 0.5; 

當您第一次循環調用它會改變全局變量的值,所以第二個遞歸調用將使用來自值最後一次迭代。

聲明變量的函數,以便它是本地的:

var width2 = width * 0.5; 
+0

你說得很對,先生 – 2014-10-03 11:08:59

+0

哇,默認情況下不在你的範圍內聲明?非常感謝你。像這樣的靜態是一個潛在的強大的功能,但我相信,如果需要像'var'這樣的術語來表示全局定義,而不是局部的話,會更好。 – alan2here 2014-10-03 11:11:31

+0

@ alan2here歡迎使用Javascript! :d – 2014-10-03 11:12:08

1

第一個猜測:更改您的代碼

if (width > 100) { 
    var width2 = width * 0.5; 
    box(x, y + 5, width2, height); 
    box(x + width2, y + 5, width2 , height); 
} 
+0

這似乎很奇怪,應該使任何區別,雖然它確實輕微,代碼是現在也稍微整潔和本來應該是,無論如何,雖然還沒有工作。這裏需要局部變量 – alan2here 2014-10-03 11:02:54

+1

。注意第二個方框()中的更改也是 – Benvorth 2014-10-03 11:07:35