JS:为什么代码在控制台上的运行方式与在.js文件上的运行方式不同?

时间:2015-10-02 23:20:45

标签: javascript console google-chrome-devtools

我正在学习JavaScript,我以下的书建议在浏览器控制台本身上测试代码最简单的地方(练习和探索概念),这就是我和我的意思。 #39;一直在做。

然而,我的一位专业朋友告诉我改为创建一个html页面,将其链接到一个js文件,然后将我想要测试的代码放在一个立即调用的函数中。这样我就可以在浏览器上加载和重新加载页面,以查看控制台上的输出。

我很困惑,如果直接在控制台上输入,而不是从文件加载,为什么同一段简单代码会运行或输出不同。

然后我在我的资料中遇到了这段代码(用于说明循环上的闭包):

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

这本书说这段代码应输出数字6五次,但当我在控制台(谷歌浏览器)上输入时,输出为5,然后是五6秒(每秒一个) )。

记住我的朋友说的话,我遵循了他的建议,实际上,相同的代码,当从链接到html的js文件执行时,输出不同,导致数字{{1} } 五次。

究竟为什么会发生这种情况?这是引擎上的差异吗?由于某种原因,编译是否会发生不同的情况?

我不知道在这里玩什么。我的朋友没有时间或知识来解释,这本书从未接触过这个主题。

1 个答案:

答案 0 :(得分:3)

您看到的第一个5不是任何console.log()来电的结果。

在控制台中键入语句时,它会自动打印语句中最后一个表达式的值。在这种情况下,它会打印上次调用setTimeout()返回的值,即计时器ID。

如果多次执行,您会看到第一个数字每次都会增加。