Javascript Console.log()和settimeout(fn,0)

Javascript Console.log()和settimeout(fn,0),javascript,asynchronous,google-chrome-devtools,Javascript,Asynchronous,Google Chrome Devtools,关于我在Chrome控制台中运行的以下代码,我有几个问题(我强调了每个循环之间的差异)。代码的目的是立即打印偶数,然后按顺序打印奇数(据我所知,堆栈是清晰的,Chrome开始在事件队列中运行) 对于第一个循环,为什么它显示未定义的?为什么需要使用(IIFE)来绑定i的当前值 例如: for( var i = 0 ; i < 5 ; i++) { if(i % 2 == 0) { console.log(i); } else { (functi

关于我在Chrome控制台中运行的以下代码,我有几个问题(我强调了每个循环之间的差异)。代码的目的是立即打印偶数,然后按顺序打印奇数(据我所知,堆栈是清晰的,Chrome开始在事件队列中运行)

  • 对于第一个循环,为什么它显示
    未定义的
    ?为什么需要使用(IIFE)来绑定
    i
    的当前值

    例如:

    for( var i = 0 ; i < 5 ; i++) {
        if(i % 2 == 0) {
            console.log(i);
        } else {
            (function(_i) {
                setTimeout(function() { console.log(_i); }, 0);
            })(i);
        }
    }
    
    for(变量i=0;i<5;i++){
    如果(i%2==0){
    控制台日志(i);
    }否则{
    (功能(i){
    setTimeout(函数(){console.log(_i);},0);
    })(i) );
    }
    }
    
    您需要使用(IIFE)来绑定
    i的当前值

    例如:

    for( var i = 0 ; i < 5 ; i++) {
        if(i % 2 == 0) {
            console.log(i);
        } else {
            (function(_i) {
                setTimeout(function() { console.log(_i); }, 0);
            })(i);
        }
    }
    
    for(变量i=0;i<5;i++){
    如果(i%2==0){
    控制台日志(i);
    }否则{
    (功能(i){
    setTimeout(函数(){console.log(_i);},0);
    })(i) );
    }
    }
    
    对于第一个循环,为什么它显示未定义?为什么会有小
    
    
    对于第一个循环,为什么它显示未定义?为什么会有小的
    注意,所有这些代码都会遇到这个常见问题注意,所有这些代码都会遇到这个常见问题有趣的是,我在for循环结束之前将其设置在上限之上。我从来不知道。我也不知道这个控制台。我见过很多未定义的东西,但从来都不知道为什么。谢谢。有趣的是,在for循环结束之前,我已经超过了设置的上限。我从来不知道。我也不知道这个控制台。我见过很多未定义的东西,但从来都不知道为什么。谢谢