Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns - Fatal编程技术网

Javascript 使用显示模块模式设置超时

Javascript 使用显示模块模式设置超时,javascript,design-patterns,Javascript,Design Patterns,在JavaScript中如何使用setTimeout函数 这是你的电话号码 HTML: JavaScript: var classA = (function() { var i = 0; var names = ["a", "b", "c", "d", "e", "f"]; var callTest = function() { for (var n in names) { window.setTimeout(function()

在JavaScript中如何使用setTimeout函数

这是你的电话号码

HTML:

JavaScript:

var classA = (function() {
    var i = 0;
    var names = ["a", "b", "c", "d", "e", "f"];
    var callTest = function() {
        for (var n in names) {
            window.setTimeout(function() {
                callTest2(names[n]);
            }, 1000);
        }
    };

    var callTest2 = function(pName) {
        $("#container1").append("In callTest   " + i+++" " + pName + "<br>");
        window.setTimeout(function() {
            callTest2(pName)
        }, 10000)
    };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();
而不是:

In callTest 0 a
In callTest 1 b
In callTest 2 c
In callTest 3 d
In callTest 4 e
In callTest 5 f

我错过了什么?我哪里做错了?

我对您的代码做了一些轻微的修改,这意味着它现在可以按照您的意愿工作:

var classA = (function() {
    var i = 0,
        names = ["a", "b", "c", "d", "e", "f"],
        namesLength = names.length,
        callTest = function() {
            window.setTimeout(function() {
                callTest2(0);
            }, 1000);
        },
        callTest2 = function(pIndex) {
            if (pIndex < namesLength) {
                var name = names[pIndex++];
                $("#container1").append("In callTest   " + i+++" " + name + "<br>");
                window.setTimeout(function() {
                    callTest2(pIndex);
                }, 1000);
            }
        };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();
var classA=(函数(){
var i=0,
姓名=[“a”、“b”、“c”、“d”、“e”、“f”],
namesLength=names.length,
callTest=函数(){
setTimeout(函数(){
callTest2(0);
}, 1000);
},
callTest2=函数(pIndex){
if(pIndex”;
setTimeout(函数(){
callTest2(pIndex);
}, 1000);
}
};
返回{
testTheTest:function(){
callTest();
}
}
})();
classA.testTheTest();

这里有一个原因。

因为函数insight setTimeout不是在那个地方调用的,而是在1秒之后调用的。当它被调用时,n等于最后一个索引。每次调用函数时,必须使n为全局值并递增

var classA = (function() {
    var i = 0;
    var names = ["a", "b", "c", "d", "e", "f"];
    var n = 0;
    var callTest = function() {
        for (var i in names) {
            window.setTimeout(function() {
                callTest2(names[n]);
                n++;
            }, 1000);
        }
    };

    var callTest2 = function(pName) {
        $("#container1").append("In callTest   " + i+++" " + pName + "<br>");
        window.setTimeout(function() {
            callTest2(pName)
        }, 10000)
    };

    return {
        testTheTest: function() {
            callTest();
        }
    }
})();

classA.testTheTest();
var classA=(函数(){
var i=0;
变量名称=[“a”、“b”、“c”、“d”、“e”、“f”];
var n=0;
var callTest=函数(){
用于(名称中的变量i){
setTimeout(函数(){
callTest2(名称[n]);
n++;
}, 1000);
}
};
var callTest2=函数(pName){
$(“#container1”).append(“在callTest中”+i++++“+pName+”
”; setTimeout(函数(){ callTest2(pName) }, 10000) }; 返回{ testTheTest:function(){ callTest(); } } })(); classA.testTheTest();
上面的代码相当于下面的代码

    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
为什么。。? 原因是函数callTest2()在一秒钟后被调用,但在此之前,整个names[]数组已经被迭代,最后一个字符“f”被传递给函数callTest2

For循环是在微秒的很小一部分进行的。i、 e.names[]数组将在很短的时间内迭代。
最后一个字符保留为“f”,即名称[n]

向上投票支持您的JS模式链接:)如果您列出您所做更改的“原因”,这将非常有用。
   for (var n in names) {
            window.setTimeout(function() {                
                callTest2(names[n]);
            }, 1000);
        }
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");
    callTest2("f");