2015-11-06 99 views
0

我怎樣才能挽救「回來」的變量在JS參數的函數是這樣的:的Javascript:參數功能

var warehouseCapacity = 100; 
var wood = 0, 
    wood_production = 1; 

function onLoad() { 
    setInterval(outCalc(), 1000); 
} 

function outCalc() { 
    calc(wood, wood_production, "wood_paragraph"); 
} 


function calc(materialVar, productionVar, Id) { 
    if (materialVar < warehouseCapacity) { 
     if ((warehouseCapacity - materialVar) < productionVar) { 
      document.getElementById(Id).innerHTML = warehouseCapacity; 
     } 
     else { 
      materialVar += productionVar; 
      document.getElementById(Id).innerHTML = materialVar; 
     } 
    } 
    else{ 
     //The warehouse is full so it can't hold any more materials. 
    } 
} 

,因爲它不會重新設置進口「materialVar」只寫出來的人。它輸入「materialVar」的值。如果我寫了這個沒有參數,它會完美的工作。

請問如果有什麼不清楚請。

對不起我的錯誤,但我不是母語的人。

回答

1

calc的第一個else塊中更改爲materialVar不會更新作爲參數傳入的變量,因爲它是按值傳遞的類型。這意味着函數獲取變量的值,但不是對變量的引用。要繼續使用的參數,而不是一個全局變量(這是一件好事),你可以從calc返回materialVar

function calc (materialVar, productionVar, Id) { 
    // ... 
    return materialVar; 
} 

然後,在outCalc,您可以撥打電話是這樣的:

wood = calc(wood, wood_production, "wood_paragraph"); 

每次調用outCalc時,都會更新wood變量。

最後一件事:你的setInterval有一個小錯誤。它立即調用outCalc,而不是等待超時,它只調用一次。

+1

不僅'outCalc'立即調用,它也被稱爲一次。它應該是'setInterval(outCalc,1000)'而不是'setInterval(outCalc(),1000)'。 – Oriol

+0

你是對的!我誤解爲'setTimeout',所以謝謝你指出它實際上應該是一個時間間隔。 –

1

你指的是「通過引用傳遞」,它不適用於JavaScript中的基元類型。將materialVar更改爲包含數字字段的對象,或者返回materialVar。

例子:

var warehouseCapacity = 100; 
var wood = { amount: 0 }; 
var wood_production = 1; 

function onLoad() { 
    setInterval(outCalc(), 1000); 
} 

function outCalc() { 
    calc(wood, wood_production, "wood_paragraph"); 
} 

function calc(materialVar, productionVar, Id) { 
    if (materialVar.amount < warehouseCapacity) { 
     if ((warehouseCapacity - materialVar.amount) < productionVar) { 
      document.getElementById(Id).innerHTML = warehouseCapacity; 
     } else { 
      materialVar.amount += productionVar; 
      document.getElementById(Id).innerHTML = materialVar.amount; 
     } 
    } else { 
     //The warehouse is full so it can't hold any more materials. 
    } 
}