Javascript 如何将值从for循环传递到settimeout函数

Javascript 如何将值从for循环传递到settimeout函数,javascript,Javascript,下面是我的javascript代码: function showBranch_init() { var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"]; for(a=0;a<id_arr.length;a++){ timeoutID = window.setTimeout(function() { showBranch(id_arr[a]); // <-- Right here

下面是我的javascript代码:

function showBranch_init() {
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"];
    for(a=0;a<id_arr.length;a++){
        timeoutID = window.setTimeout(function() {

            showBranch(id_arr[a]); // <-- Right here

        }, 500);
    }
}
函数showBranch_init(){ 变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”];
对于(a=0;a,通过为每个迭代步骤引入一个新范围(通过函数调用),您可以像下面这样传递参数:

function showBranch_init() {
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"];
    for(a=0;a<id_arr.length;a++){
        (function(i) {
            timeoutID = window.setTimeout(function() {
                showBranch(id_arr[i]); // <-- Right here
            }, 500*i);
         })(a);
    }
}
函数showBranch_init(){ 变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”];
对于(a=0;a,通过为每个迭代步骤引入一个新范围(通过函数调用),您可以像下面这样传递参数:

function showBranch_init() {
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"];
    for(a=0;a<id_arr.length;a++){
        (function(i) {
            timeoutID = window.setTimeout(function() {
                showBranch(id_arr[i]); // <-- Right here
            }, 500*i);
         })(a);
    }
}
函数showBranch_init(){ 变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”]; 对于(a=0;a
函数showBranch_init(){
变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”];
timeoutID=window.setTimeout(函数(){
对于(a=0;a
函数showBranch_init(){
变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”];
timeoutID=window.setTimeout(函数(){
对于(a=0;a

函数showBranch_init(){ 变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”]; 对于(a=0;a

函数showBranch_init(){ 变量id_arr=[“jdc_b1”、“jdc_b2”、“jdc_b3”、“jdc_b4”];
对于(a=0;艾米问题a是一个全局变量?这不正确,
a==id_arr.length-1
适用于所有超时。但超时的原因是什么?它们将同时执行。@FelixKling是的,当我使用下面的答案时,我刚刚发现了这一点。我预期会发生的是,e将延迟500毫秒每次执行,但都是在同一时间执行的:|对于那个问题,请看。我的问题a是一个全局变量?它不正确,
a==id\u arr.length-1
对于所有超时。但超时的原因是什么?它们都将在同一时间执行。@FelixKling是的,我在使用下面的答案时才发现这一点。我是预计每次执行都会有500毫秒的延迟,但都是在同一时间执行的:|关于这个问题,请参阅。请不要使用“关闭”一词描述这种解决方案。传递给
setTimeout
的回调已经是一个闭包。实际的解决方案是通过执行一个函数而不是创建另一个闭包来创建一个新的作用域。执行的函数是否是闭包与此无关。+1但在for循环之外定义函数,请因为每次迭代时它都会创建一个请不要使用术语“闭包”描述这种解决方案。传递给
setTimeout
的回调已经是一个闭包。实际的解决方案是通过执行一个函数而不是创建另一个闭包来创建一个新的作用域。执行的函数是否是闭包与此无关。+1但在for循环之外定义函数,请因为每次你迭代它都会创建一个。你能解释你的解决方案,而不是仅仅发布代码吗?OP的代码怎么了?你能解释你的解决方案,而不是仅仅发布代码吗?OP的代码怎么了?
function showBranch_init() {
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"];
    for(a=0;a<id_arr.length;a++){
        timeoutID = window.setTimeout(function(idvalue) {
            showBranch(idvalue);
        }(id_arr[a]), 500);
    }
}