为什么这个循环不能停止?

时间:2017-04-06 14:19:01

标签: javascript jquery

我尝试使用jquery(jquery-2.1.1)和构造函数来构建html。但是当我在for循环中尝试这种方法时,循环无法停止。谁能告诉我它为什么会发生?

下面'代码。非常感谢。

function tag() {
    this.addClass = function(...theArgs) {
        for (index in theArgs) {
            this.$html.addClass(theArgs[index]);
        }       
    }

    this.setAttr = function(attr, value) {
        this.$html.attr(attr, value);
    }

    this.append = function(...theArgs) {
        for (index in theArgs) {
            this.$html.append(theArgs[index]);
        }
    }

    this.find = function(value) {
        return this.$html.find(value);
    }

    this.empty = function() {
        this.$html.empty();
    }

    this.remove = function(value) {
        this.find(value).remove();
    }

    this.clone = function() {
        return jQuery.extend(true, {}, this);
    }

    this.show = function() {
        return this.$html[0];
    }
}

function label(text) {
    tag.call(this);

    this.$html = $("<label></label>");
    this.append(text);
}


for(var index = 0; index < 2; index++) {
        var fieldLabel = new label(1);
        console.log(index);
}

1 个答案:

答案 0 :(得分:0)

这里的问题是你使用index(没有var)作为tag函数中所有循环的运行变量。 index变量在最后for-loop的外部范围内仍然有效(应该以条件>=2停止)。

在循环开始时,index0。下一个循环应该是1。但是当进入内部append方法时,由于循环0(传入的参数只是for-in),它会重置回1,因此传播符号会产生1个长度的数组,for-in停止且index设置为0)。所以在第二个循环结束时它仍然是0。这意味着它永远不会变得更大值1(仅在for-loop的开头增加)。条件< 2将始终得到满足,for-loop只会永远运行。

您可以在for-in中为正在运行的变量使用其他名称。或者只使用index声明另一个本地范围的var,如下所示:

this.append = function(...theArgs) {
    for (var index in theArgs) {
        this.$html.append(theArgs[index]);
    }
}

或者更好地使用for-of作为有人建议。