我正在学习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} } 五次。
究竟为什么会发生这种情况?这是引擎上的差异吗?由于某种原因,编译是否会发生不同的情况?
我不知道在这里玩什么。我的朋友没有时间或知识来解释,这本书从未接触过这个主题。
答案 0 :(得分:3)
您看到的第一个5
不是任何console.log()
来电的结果。
在控制台中键入语句时,它会自动打印语句中最后一个表达式的值。在这种情况下,它会打印上次调用setTimeout()
返回的值,即计时器ID。
如果多次执行,您会看到第一个数字每次都会增加。