JavaScript : Use of closure variable

标签 javascript html closures

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

相关文章:

javascript - 具有多个参数的复选框函数调用

javascript - 等高不工作.js 文件

javascript - 使用 getElementsByName 将 TextBox 替换为 CHECKBOX

jquery - 保持文本区域和按钮等高

javascript - 为什么我的 .draggable 方法返回错误?

objective-c - 如何调用接受 block 字典作为 Swift 参数的 Objective-C 函数?

java - 读取动态填充的txt文件

Python闭包,为每个嵌套函数创建具有不同ID的新int

coldfusion - 使用查询排序

javascript - 如何使javascript/jquery代码防错?