奇数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);