奇数javascript代码执行顺序

奇数javascript代码执行顺序,javascript,Javascript,好的,第一个堆栈溢出问题。我希望我做得对 我正在尝试运行以下代码: for(var i = 1; i < 17; i++){ console.log("for loop runs. i is " + i); setTimeout(function(){ console.log("setTimeout runs. i is " + i); if(i < 3){ $( ".example1" ).append

好的,第一个堆栈溢出问题。我希望我做得对

我正在尝试运行以下代码:

    for(var i = 1; i < 17; i++){
    console.log("for loop runs. i is " + i);
    setTimeout(function(){
        console.log("setTimeout runs. i is " + i);
        if(i < 3){
            $( ".example1" ).append( i );
            $( ".example2" ).append( i );
            $( ".example3" ).append( i );
            $( ".example4" ).append( i );
            $( ".example5" ).append( i );
        }
        else if(i<5){
            $( ".example1" ).append( i );
            $( ".example2" ).append( i );
            $( ".example3" ).append( i );
            $( ".example5" ).append( i );
        }
         else if(i<11){
            $( ".example1" ).append( i );
            $( ".example2" ).append( i );
            $( ".example3" ).append( i );
        }
        else if(i<15){
            $( ".example1" ).append( i );
            $( ".example3" ).append( i );           
        }
        else if(i<17){
            $( ".example1" ).append( i );
        }
    },200);
} //end for loop
for(变量i=1;i<17;i++){
log(“对于循环运行,i是”+i);
setTimeout(函数(){
log(“setTimeout runs.i是”+i);
如果(i<3){
$(“.example1”)。附加(i);
$(“.example2”)。附加(i);
$(“.example3”)。附加(i);
$(“.example4”)。附加(i);
$(“.example5”)。附加(i);
}

否则如果(i执行
setTimeout
时变量没有预期值

可变关闭问题。拯救生命:

for(var i = 1; i < 17; i++){
  console.log("for loop runs. i is " + i);
  (function (ii) {
    setTimeout(function(){
      console.log("setTimeout runs. ii is " + ii);
      // the rest of your code goes here
    },200);
  }(i));
}
执行此函数时,
x
y
z
获取此函数范围内的变量

其次,执行函数,传递必要的参数:

function (x, y, z) {
  // stuff here
};
function (x, y, z) {
  // stuff here
}(a, b, c);
a
b
c
已经变为变量,可能在全局范围内,现在您将它们的当前值作为参数传递给此函数

第三,将函数包装在括号中,以便JavaScript解释器将其视为一个函数

顺便说一句,这也行得通:

!function (x, y, z) {
  // stuff here
}(a, b, c);
…就像
~
+
-
一样。您只需要在行的开头添加一些良性操作符,就可以将JS从函数声明的狂热中解放出来


有点像
for
循环,当函数执行时,函数参数变量会自动
var
'd,但在这种情况下,作用域在函数本身内。因此,在执行该行代码时,
i
的值会传递给IIFE函数内的新变量
ii
现在,当
setTimeout
最终准备好执行时,它将查看该函数范围,而不是全局范围,以获取值。

阅读有关javascript中闭包的更多信息。这里发生的是多个函数(闭包)都是为共享同一环境的循环内部创建的。到调用setTimeout函数时,循环完成迭代,i变量始终设置为17


对于i=1到16(如预期)的循环运行16次,请阅读更多信息。 您的setTimeout也运行了16倍,因为它在同一个周期内


由于setTimeout函数在200毫秒后运行,但for循环的16次迭代在该时间的一小部分内运行,因此,当i已设置为17时,所有setTimeout都会在for循环结束后很长时间内运行。

我认为您答案的第二段不正确。setTimeout将始终在循环结束时运行,因为循环保持单个th阅读繁忙。尝试更多的迭代和更短的时间,我不认为你错了:)谢谢,这非常有用:)太棒了,谢谢:)
(function (x, y, z) {
  // stuff here
}(a, b, c));
!function (x, y, z) {
  // stuff here
}(a, b, c);