gpt4 book ai didi

JavaScript : Use of closure variable

转载 作者:行者123 更新时间:2023-11-28 05:39:10 25 4
gpt4 key购买 nike

我正在尝试使下面的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com