有人可以解释以下两个输出吗?
代码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"]
按预期输出......
答案 0 :(得分:3)
我认为你在使用Chrome是对的吗? Firebug不会这样做(我刚检查过 - FF8.0,FB 1.8.4)但Chrome 16确实如此。
我认为正在发生的事情是,在Chrome中,console.log()是异步执行的,以免中断您的代码或其他内容;实际上,在调用它们的代码完成运行后,所有console.log()都会立即发生。
编辑:诅咒,忍者!
答案 1 :(得分:2)
console.log
总是有点“迟到”,当谈到对象时你不能指望它。只有原语(字符串等)才能直接起作用。在前者中,内存中只有一个实例,因此当控制台获取数据时,它可能已经发生了变化。
当然,这取决于您实际使用的是哪个控制台,但我经常在Chrome上遇到此问题。
答案 2 :(得分:1)
console.log
console.log
中的execute scope
快照元素,并在控制台中打印它们。这里有一个示范:
(function () {
console.log(obj);
var obj= {};
obj.new_value = 'hello';
}())
调用obj
时未定义 console.log
。但它使用正确的属性new_value
打印到控制台中。
首先,当使用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会导致代码在实现中无法可靠地移植。
答案 3 :(得分:0)
无法使用
在FF 8.0中复制x = [1,2,3,4,5];
console.log(x);
y();
function y() {
z = x.shift();
console.log(z);
}