Google Chrome console.log不按顺序排列?

时间:2011-11-15 14:53:41

标签: javascript google-chrome console shift

有人可以解释以下两个输出吗?

代码1:

console.log(itemsAry);
//loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
}

结果:

["cat-53", "cat-57", "cat-51", "cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]

(如预期的那样)。

代码2:

console.log(itemsAry);
loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
}

结果:

["cat-57", "cat-51", "cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]

cat-53

请注意,cat-53已经从原始数组PRIOR转移到console.log()输出,该输出应该在shift操作发生之前发生。我怎么可能?或者我错过了什么?

编辑:情况变得更糟:

console.log(itemsAry);
loadNextItem(); loadNextItem(); loadNextItem(); loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
    console.log(itemsAry);
}

结果:

["cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-53
["cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-57
["cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-51
["cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-10

在FireFox中测试后,它似乎是Google Chrome问题。 FF输出:

["cat-53", "cat-57", "cat-51", "cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-53
["cat-57", "cat-51", "cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-57
["cat-51", "cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-51
["cat-10", "cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]
cat-10
["cat-55", "cat-56", "cat-5", "cat-50", "cat-3", "cat-54", "cat-52", "cat-9", "cat-8", "cat-4", "cat-58", "cat-6", "cat-7"]

按预期输出......

4 个答案:

答案 0 :(得分:3)

我认为你在使用Chrome是对的吗? Firebug不会这样做(我刚检查过 - FF8.0,FB 1.8.4)但Chrome 16确实如此。

我认为正在发生的事情是,在Chrome中,console.log()是异步执行的,以免中断您的代码或其他内容;实际上,在调用它们的代码完成运行后,所有console.log()都会立即发生。

编辑:诅咒,忍者!

答案 1 :(得分:2)

console.log总是有点“迟到”,当谈到对象时你不能指望它。只有原语(字符串等)才能直接起作用。在前者中,内存中只有一个实例,因此当控制台获取数据时,它可能已经发生了变化。

当然,这取决于您实际使用的是哪个控制台,但我经常在Chrome上遇到此问题。

Here is someone who experienced this on Firebug.

答案 2 :(得分:1)

console.log

的行为

console.log中的execute scope快照元素,并在控制台中打印它们。这里有一个示范:

(function () {
  console.log(obj);
  var obj= {};
  obj.new_value = 'hello';
}())
调用obj时未定义

console.log。但它使用正确的属性new_value打印到控制台中。

firefox的问题

首先,当使用function关键字在firefox中声明一个函数时,在执行代码之前不会分配函数的名称。

如果您之前的代码中未定义loadNextItem,则以下代码将在firefox中生成错误(ReferenceError: loadNextItem is not defined)。

loadNextItem();

function loadNextItem (){
    var item = itemsAry.shift();
    console.log(item);
}

此行为在ECMA-262

中说明
  

已知几种广泛使用的ECMAScript实现支持将FunctionDeclaration用作Statement。然而,在应用于此类FunctionDeclarations的语义中的实现之间存在显着且不可调和的变化。由于这些不可调和的差异,使用FunctionDeclaration作为Statement会导致代码在实现中无法可靠地移植。

firefox doesn't support这种行为。

答案 3 :(得分:0)

无法使用

在FF 8.0中复制
x = [1,2,3,4,5];
console.log(x);
y();
function y() {
    z = x.shift();
    console.log(z);
}