我已经四处寻找了答案。
这是我的代码:
function appendShopItem(shopItem, subTotal)
{
// Create the list item:
var item = document.createElement( 'li' );
// Set its contents:
item.appendChild( document.createTextNode(
shopItem.name + ' - ' + shopItem.cost + ' Gold'
) );
// Add it to the list:
list.appendChild( item );
var radio = document.createElement( 'button' );
var text = document.createTextNode( "Buy " + shopItem.name + " for " + shopItem.cost + " Gold");
radio.name = 'shop';
radio.value = shopItem.name;
radio.onclick = function () {
subTotal += shopItem.cost;
addValue( shopItem, subTotal );
};
radio.appendChild( text );
document.body.appendChild( radio );
var lineBreak= document.createElement("BR");
document.body.appendChild(lineBreak);
}
function addValue(shopItem, subTotal)
{
document.getElementById("extraSubHeader").innerHTML = "Current Total: " + subTotal + " Gold"
}
function enterShop(position, locationNames, locationDescriptions, buttons, buttonActions, shopItems, shopCosts)
{
subTotal = 0;
document.getElementById("extraHeader").style.visibility = "visible";
document.getElementById("extraHeader").innerHTML = "Welcome to the Shop!";
document.getElementById("extraSubHeader").style.visibility = "visible";
document.getElementById("extraSubHeader").innerHTML = "Current Total: 0 Gold"
document.getElementById("list").style.visibility = "visible";
document.getElementById("option1").style.visibility = "hidden";
document.getElementById("option2").style.visibility = "hidden";
document.getElementById("optionalInfo").style.visibility = "hidden";
document.getElementById("subHeader").style.visibility = "hidden";
document.getElementById("actionButton").innerHTML = "Leave Shop";
document.getElementById("actionButton").onclick = function (){ loadData(position, locationNames, locationDescriptions, buttons, buttonActions, shopItems, shopCosts); hideShop(); }
document.getElementById("header").style.visibility = "hidden";
for( var i = 0; i < shopItems.length; ++i )
{
appendShopItem( shopItems[i], subTotal );
}
var clearButton = document.createElement("BUTTON");
var text = document.createTextNode("Clear Selection");
clearButton.onclick = function () {
subTotal = 0;
};
clearButton.appendChild(text);
document.body.appendChild(clearButton);
}
变量
subTotal
根据您选择的物品的价格而增加。如果我多次单击按钮,则subTotal
会增加。效果很好,但是还有一个按钮可以重置总数。这就是问题所在。即使我将subTotal设置为0,它仍然从上次停止的地方继续增加。例如,如果项目的价格为
10
,则单击按钮5
次将使subTotal
变为50
。如果再单击Clear Selection
(“重置”按钮),则subTotal
应该回到0
。但是,再次单击该按钮将使subTotal
变为60
,而不是默认为0
然后变为10
。任何帮助表示赞赏!
最佳答案
由于闭包,似乎是经典的变量范围界定问题。
在appendShopItem
中,您具有此事件处理程序
radio.onclick = function () {
subTotal += shopItem.cost;
addValue( shopItem, subTotal );
};
绑定到eventHandler的subTotal是调用
appendShopItem
时传递的值。因此,即使将
subTotal
重置为0
,仍然会绑定一个较早的值,并且一旦单击单选按钮,就会使用subTotal
的旧值。您可以进行重构,以使
subTotal
不会被传递,但是可以使它成为所有这些函数均可访问的变量。关于javascript - 在Javascript中将变量重置为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31302422/