2015-09-06 73 views
0

我正在嘗試創建一個名爲PIG的老式骰子游戲的JavaScript版本。它涉及滾動骰子並跟蹤每個滾動的總和。我需要能夠保存一個函數中的每個滾動,然後能夠調用所述函數來返回當前滾動分數。在不輸入Javascript參數的情況下調用某個函數


這是採用現有的捲筒,並將其存儲的amount入變量總,隨後返回當前total變量的方法。

function rollTotal(amount) { 
    return amount; 
    } 

我第一次調用該函數並插入擲骰子到amount參數的得分...

var dieOne = 1; 
var dieTwo = 2; 
rollTotal(dieOne + dieTwo); 

然後我調用該函數返回當前比分像這樣...

rollTotal() 

,並正在此...

undefined 

有沒有辦法設置一個默認參數返回當前的分數,如果調用時沒有輸入參數?

+0

'amount = amount == null? defaultValue:amount' – elclanrs

+2

這沒有意義。 'rollTotal'不更新任何變量。它只是一個身份函數,所以'rollTotal()'返回'undefined'而不是'NaN'。 – Oriol

+0

@Oriol感謝您的領導!這確實是我得到的,我剛剛發佈了一個錯字。我糾正了我的錯誤。 –

回答

0

一種流行的方式做,這是一個類的實例。

即:

function Dice() { 
    var amount; 

    this.rollTotal = function(_amount) { 
     // if an argument is supplied, assign it to the internal amount 
     if (typeof _amount !== "number") { 
      amount = _amount; 
     } 
     return amount; 
    }; 
} 

用法示例:

var dice = new Dice(); 
dice.rollTotal(3); 
console.log(dice.rollTotal()); 
+0

最近downvoter會照顧解釋他們的推理嗎? – jczimm

1

當你調用一個函數,並且不提供參數,則該參數勢必undefined在函數中。所以,你可以做這樣的事情:

var currentAmount = undefined; // or perhaps 0? 
function rollTotal(amount) { 
    if (typeof(amount) === 'undefined') { 
     return currentAmount; 
    } else { 
     currentAmount = amount; 
     return amount; 
    } 
} 

你可以做到這一點更優雅(更安全)使用封閉:

var rollTotal = (function() { 
    var currentAmount = undefined; 
    return function(amount) { 
     if (typeof(amount) === 'undefined') { 
      return currentAmount; 
     } else { 
      currentAmount = amount; 
      return amount; 
     } 
    }; 
}()); 

您可能還需要做的說法更穩健的測試並將任何非數字視爲未定義。爲undefined

!isNaN(parseFloat(amount)) && isFinite(amount) 

,而不是測試的具體做法是:你可以用下面的測試做到這一點。

編輯:由於@保羅S.所指出的,作爲一個參數是否傳遞最佳的測試是arguments.length === 0

+2

下決心是否願意解釋這裏有什麼問題?你是否在OP的問題中讀到我錯過的東西? –

+0

你可以做的一個不同的測試是'arguments.length === 0',否則這個IIFE版本基本上是我所寫的 –

+0

@PaulS。 - 是的,測試'arguments.length'可能是正確的選擇。 –

0

在JavaScript中,你可以看看arguments object檢查參數是否通過與否時被調用的函數。調用函數時,如何檢查是否傳遞了argumemt。

function rollTotal(amount){ 
    if(arguments.length === 0) 
    return (a value when no arguments were passed); 
    else return amount; 
} 
+0

你爲什麼要檢查'arguments [0]'是否存在而不是'amount'?此外,問題中概述的功能不會擲骰子,它只是保存一個值。 – jczimm

1

爲什麼使用函數? =運營商工作得很好。

// initial setup 
var rollTotal; 

// set in the middle of an expression 
"You just rolled " + (rollTotal = dieOne + dieTwo) + "!"; 

// recalling later in an expression 
"Last time you rolled " + rollTotal + ", what will you get this time?"; 
相關問題