2015-03-19 66 views
2

我有HTML代碼,看起來像這樣:這種類型的遞歸在JavaScript中不好嗎?如果是這樣,我應該如何重寫它?

<body> 
    <label for="change0">What is your favorite number?</label> 
    <input type="text" id="change0" /> 
    <div id="addStuff"></div> 

    <script src="scripts/main.js"></script> 
</body> 

我有JS,看起來像這樣:

/** @type {number} */ 
var counter = 1; 

function doStuff(id) { 
    var thing = document.getElementById(id); 
    thing.addEventListener('change', doMoreStuff); 
} 

function doMoreStuff() { 
    counter++; 
    var addStuff = document.getElementById("addStuff"); 
    var stuff = document.createElement("input"); 
    stuff.id = "change" + counter; 
    stuff.type = "text"; 
    addStuff.appendChild(stuff); 
    doStuff(stuff.id); 
} 

window.onload = function() { 
    /** @constant */ 
    var SEED_ID = "change0" 
    doStuff(SEED_ID); 
}; 

的doMoreStuff()函數遞歸調用doStuff()函數。 JavaScript是否正確地管理內存,還是我不正確地做這件事?

+0

如果doStuff也叫doMoreStuff,你的代碼會崩潰。 – 2015-03-19 12:21:25

+1

而不是將ID傳入您的'doStuff'函數,您可以傳入元素。這意味着你根本不必爲動態添加的'input'元素賦予一個'id'屬性。在你的'window.onload'中執行'doStuff(document.getElementByID(SEED_ID))',然後在'doMoreStuff()'函數中執行'doStuff(stuff)'。 – 2015-03-19 12:21:36

+0

我不認爲你明白遞歸意味着什麼。如果doStuff稱爲doStuff,那麼真正的遞歸調用就是如此,那麼是的,你可能遇到問題。你的代碼沒有什麼問題,事實上,把你的代碼分成多個函數調用是一種很好的編程習慣,因爲它更容易跟蹤和維護。 – Russ 2015-03-19 12:23:00

回答

4

doMoreStuff()函數遞歸調用doStuff()函數。

這不是一個真正相互遞歸,作爲doStuff不叫doMoreStuff - 它只是將它作爲被稱作處理。

不JavaScript的管理內存正確

是。異步「遞歸」(有時稱爲pseudo-recursion)不會增長調用堆棧,這很像尾遞歸。

1

你有什麼不是遞歸。 doStuff函數只是將事件處理程序綁定到事件,並且在事件處理程序中重用該函數。

它與遞歸類似,但等待事件發生會打破鏈條。您需要考慮以與程序代碼不同的方式處理事件,否則當您需要考慮幾個不同的事件時,您會遇到困難。

重複使用代碼是一個偉大的工具,但在這種情況下,它不會做太多。你綁定事件的方式都不是很相似的,所以你可以重複剛纔的addEventListener通話兩個地,代碼變得更加簡單:

function doMoreStuff() { 
    counter++; 
    var addStuff = document.getElementById("addStuff"); 
    var stuff = document.createElement("input"); 
    stuff.id = "change" + counter; 
    stuff.type = "text"; 
    addStuff.appendChild(stuff); 
    stuff.addEventListener('change', doMoreStuff); 
} 

window.onload = function() { 
    document.getElementById("change0").addEventListener('change', doMoreStuff); 
}; 
+0

真棒建議,謝謝! – BackPacker777 2015-03-19 12:51:09

相關問題