Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个循环不能停止?_Javascript_Jquery - Fatal编程技术网

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

Javascript 为什么这个循环不能停止?,javascript,jquery,Javascript,Jquery,我尝试使用jquery(jquery-2.1.1)和构造函数来构建html。但当我在for循环中尝试此方法时,循环无法停止。谁能告诉我为什么会这样 这是密码。非常感谢 function tag() { this.addClass = function(...theArgs) { for (index in theArgs) { this.$html.addClass(theArgs[index]); } }

我尝试使用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);
}
函数标签(){
this.addClass=函数(…theArgs){
for(在args中索引){
这个.html.addClass(theArgs[index]);
}       
}
this.setAttr=函数(attr,value){
这是.html.attr(attr,value);
}
this.append=函数(…theArgs){
for(在args中索引){
这个.html.append(theArgs[index]);
}
}
this.find=函数(值){
返回此值。$html.find(值);
}
this.empty=函数(){
这是。$html.empty();
}
this.remove=函数(值){
this.find(value.remove();
}
this.clone=函数(){
返回jQuery.extend(true,{},this);
}
this.show=函数(){
返回此。$html[0];
}
}
函数标签(文本){
标记。调用(此);
这个。$html=$(“”);
本.附加(文本);
}
对于(var指数=0;指数<2;指数++){
var fieldLabel=新标签(1);
控制台日志(索引);
}

这里的问题是使用
索引(不带
var
)作为
标记
函数中所有循环的运行变量。最后,
索引
变量在循环
外部范围内仍然有效(应在条件
=2时停止)

循环开始时,
索引
0
。下一个循环应该是
1
。但是当进入内部
append
方法时,由于in
的循环
,它被重置回
0
(传入的参数只是
1
,因此扩展表示法生成一个长度为1的数组,而
for in
索引设置为
0
时停止)。因此,在第二个循环的末尾,它仍然是
0
。这意味着它永远不会大于值
1
(该值仅在循环
开始时增加)。将始终满足条件
<2
,循环的
将永远运行

您可以在
中为运行变量使用另一个名称。或者使用
var
声明另一个本地范围的
索引,如下所示:

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

或者更好地按照某人的建议使用
for of

.append()
中有一个未声明的
索引,它们是冲突的:
for(args中的索引){
。一定要声明变量:
for(args中的var index){
…也在
addClass()
。使用像ESLint这样的linter来查找这些常见错误。这将为您节省大量时间……在JS中,在数组中使用
for in
不是一个好主意。因为您使用的是
语法,您必须对ES6的东西没有问题,所以我建议使用
for of
循环。为什么?为什么您要包装std jquery功能In这一团糟?我以前也写过类似的功能,但最终视图变得严重臃肿和低效。一年后,我改用模板系统,再也没有回头。它们渲染得更快,视图代码也变得更小。@CharlesZhou如果有帮助,请慢慢接受答案。否则,您将uld删除您的问题,因为它看起来只是一个简单的错误,没有被其他人利用。