任何人都可以解释为什么以下代码在作为函数的一部分运行时有效,但是当它在Chrome控制台窗口中自行运行时会产生奇怪的结果?
var foo = function() { var x = 1; while (x<3) { console.log(x); x = x+1; } } foo(); // This prints 1,2 as expected
但是当我直接在Chrome控制台中运行时,我得到1,2,3这没有任何意义(参见图片输出):
var y = 1; while (y<3) { console.log(y); y = y+1; } // This prints 1,3 in the console
请注意,有一些类似于console.log的问题导致undefined(Chrome/Firefox console.log always appends a line saying undefined),但我的示例中没有函数调用,而且没有返回任何值.
解决方法
您被Chrome的JavaScript控制台误导了.
除了console.log()调用的输出之外,控制台还显示在您运行的代码中执行的最后一个表达式的值.
在第一个例子中,最后一个表达式是foo();最后打电话. foo()不返回任何值,因此结果是未定义的,这是在console.log(y)调用print的1和2之后打印的内容.
在第二个例子中,console.log()仍然只被调用两次,再次打印1和2.之后打印的3不是来自console.log()调用,它是执行的最后一个表达式的值,最后一个y = y 1;使y最多为3并导致while循环终止.
这是另一个例子.将此代码粘贴到控制台中:
var y = 1,message = ''; while( y < 3 ) { console.log( y ); y = y + 1; message = 'y is ' + y; }
现在它打印:
1 2 "y is 3"
1和2再次来自console.log(y)调用.与其他示例一样,在代码完成运行后,它会打印最后执行的表达式 – 但现在该表达式为:
message = 'y is ' + y;
其中y在结尾处再次为3.
或者一个更简单的例子.在控制台中输入:
console.log( 'Hi!' );
它打印:
Hi! undefined
嗨!是你的console.log()执行,undefined是console.log()调用的返回值.
这里的另一个线索是在每个示例中打印到控制台的最后一个值左侧的小符号.看起来这个符号意味着开发工具会自动打印值,而不是从console.log()调用.