我正在尝试使下面的 html/javascript 程序正常工作。 它基本上运行两个计数器,不起作用的功能是重置计数器选项。
“initCounter”方法使用给定的初始值初始化两个计数器。 按“Incr 5”、“Incr 3”按钮将使值增加“5”或“3”。按重置按钮应将值重置为零,但目前尚未发生。
在“runCounter”方法中,我使用变量“localCxt”,它将具有计数器的当前值。
在“reset_fn”方法中,我将“localCxt”变量重置为零,但这不起作用,计数器值未重置为零。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/javascript">
var reset_fn;
function runCounter(initVal) {
var localCxt = initVal;
reset_fn = function reset() {
localCxt = 0
}
return function (ctr) {
localCxt += ctr;
return (localCxt);
}
}
function initCounter() {
//get the initial value of the counter
var val = parseInt(startInput.value);
if (isNaN(val)){
val = 0
}
ctr5 = runCounter(val);
ctr3 = runCounter(val);
document.getElementById("ctr5").disabled = false;
document.getElementById("ctr3").disabled = false;
document.getElementById("rst").disabled = false;
document.getElementById("init").disabled = true;
}
function displayCtr(ctr_val){
var doc
if (ctr_val == 5) {
var val = ctr5(ctr_val)
doc = document.getElementById("res5");
}
if (ctr_val == 3) {
var val = ctr3(ctr_val)
doc = document.getElementById("res3");
}
doc.innerHTML = val;
}
function resetCnts() {
doc5 = document.getElementById("res5");
doc3 = document.getElementById("res3");
doc5.innerHTML = 0;
doc3.innerHTML = 0;
reset_fn();
document.getElementById("init").disabled = false;
}
function start(){
document.getElementById("ctr5").disabled = true;
document.getElementById("ctr3").disabled = true;
document.getElementById("rst").disabled = true;
}
</script>
</head>
<body onload="start()">
<input type="text" id="startInput" value="0">
<button id="init" onclick="initCounter()">Initilaize</button>
<button id="ctr5" onclick="displayCtr(5)">Incr 5</button>
<button id="ctr3" onclick="displayCtr(3)">Incr 3</button>
<button id="rst" onclick="resetCnts()">reset</button>
<div id="res5" class="cl5">_</div>
<div id="res3" class="cl3">_</div>
</body>
</html>
最佳答案
有一个全局的reset_fn,每次调用runCounter函数时都会被覆盖。
我可以建议您重新考虑您的设计吗?将有关对象的所有内容保留在对象内部,如下所示:
function Counter(value){
this.context=value;
this.reset = function() {this.context=0};
this.addVal = function(val) {this.context+=val};
}
然后创建var ctr5 = new Counter(5)
并执行ctr5.reset()
和ctr5.addVal(ctr_val)
您还可以将所有文档元素封装在同一个对象中。
更新: 正如评论中所建议的,您可以使用其原型(prototype)向类添加方法:
function Counter(value){
this.context = value;
}
Counter.prototype = {
reset: function() {this.context = 0},
addVal: function(val) {this.context += val}
};
要点是,使用对象来解决这个问题。 Javascript 中有多种方法可以创建对象并向其添加属性和方法,您可以轻松通过 Google 搜索这些方法。
关于JavaScript : Use of closure variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070884/