首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌Chrome console.log失序?

谷歌Chrome console.log失序?
EN

Stack Overflow用户
提问于 2011-11-15 22:53:41
回答 4查看 2.7K关注 0票数 7

有人能解释一下下面的两个输出吗?

代码1:

代码语言:javascript
复制
console.log(itemsAry);
//loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
}

结果:

代码语言:javascript
复制
["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:

代码语言:javascript
复制
console.log(itemsAry);
loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
}

结果:

代码语言:javascript
复制
["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在console.log()输出之前已从原始数组移位,该输出应该在shift操作发生之前发生。这怎么可能呢?或者我错过了什么?

编辑:情况变得更糟:

代码语言:javascript
复制
console.log(itemsAry);
loadNextItem(); loadNextItem(); loadNextItem(); loadNextItem();
function loadNextItem(){
    var item = itemsAry.shift();
    console.log(item);
    console.log(itemsAry);
}

结果:

代码语言:javascript
复制
["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输出:

代码语言:javascript
复制
["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"]

输出与预期一致...

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-15 22:55:42

console.log总是有点“晚”,当涉及到对象时,你不能指望它。仅原语(字符串等)将直接工作。对于前者,内存中只有一个实例,因此当控制台获取数据时,它可能已经更改了。

当然,这取决于你实际使用的是哪个控制台,但我在Chrome上经常遇到这种情况。

Here is someone who experienced this on Firebug.

票数 3
EN

Stack Overflow用户

发布于 2011-11-15 23:03:34

我认为你在使用Chrome,对吗?Firebug不能做到这一点(我刚刚检查了- FF8.0,FB1.8.4),但是Chrome16做到了。

我认为在Chrome中,console.log()是异步执行的,这样就不会中断您的代码或其他东西;实际上,所有的console.log()都是在调用它们的代码完成运行后立即发生的。

编辑:诅咒,忍者!

票数 4
EN

Stack Overflow用户

发布于 2011-11-15 23:34:55

console.log的行为

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

代码语言:javascript
复制
(function () {
  console.log(obj);
  var obj= {};
  obj.new_value = 'hello';
}())

调用console.log时未定义obj。但是它会使用正确的属性new_value打印到控制台中。

firefox的问题

首先,当在火狐中使用function关键字声明函数时,直到代码执行时才会分配函数的名称。

如果您在前面的代码中没有定义loadNextItem,下面的代码将在firefox中生成一个错误(ReferenceError: loadNextItem is not defined)。

代码语言:javascript
复制
loadNextItem();

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

此行为在ECMA-262中进行了说明

众所周知,ECMAScript的几个广泛使用的实现都支持将FunctionDeclaration用作语句。然而,在应用于此类FunctionDeclarations的语义中,不同实现之间存在着不可调和的显着差异。由于这些不可调和的差异,将FunctionDeclaration用作语句会导致代码在不同实现之间不能可靠地移植。

然后firefox doesn't support这个行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8138248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档