在循环执行之前出现函数结果

时间:2017-02-18 17:03:35

标签: javascript

我的问题是:为什么功能结果出现在浏览器控制台中的for循环之前?它应该运行循环(1,2,3,4,5),但它首先运行('酷'和1!2!3),所以下面我添加我的代码和控制台结果。如果有人能解释我这种行为,我将非常感激。它不是重复的,因为,我想了解它是如何工作的,而不是让它工作。在建议的问题中,有一个解决方案首先使用setTimeout运行循环,但不能完全解释行为。

// Loops + Closure
for (let i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i)
    }, i * 1000)
}

//Modules
function CoolModule() {
    let something = 'cool'
    let another = [1, 2, 3]

    function doSomething() {
        console.log(something)
    }

    function doAnother() {
        console.log(another.join('!'))
    }

    return {
        doSomething: doSomething,
        doAnother: doAnother
    }
}

let foo2 = CoolModule()

foo2.doSomething() // 'cool'

foo2.doAnother() // 1 ! 2 ! 3

console result

1 个答案:

答案 0 :(得分:0)

JavaScript通过一个接一个地运行代码块来工作。因此,您有一个以for循环开头并以foo2.doAnother()结尾的代码块。但是对setTimeout的调用不会立即运行代码 - 它们会在队列中放置新的代码块 - console.log(i)块。所以你的代码更像是;

  1. 将五个'计时器'功能放入队列中。每个人在执行之前必须等待1s,2s,3s等,每个必须在当前阻止之后执行。
  2. 执行'CoolModule'代码。
  3. (您编写的代码完成执行)
  4. (等待1s)
  5. 运行timer()
  6. 的第一个实例
  7. (再等一下)
  8. 运行timer()
  9. 的第二个实例
  10. 等...