4

我遇到了一个相当有趣的问题。下面的代码生成一个数组,在记录时会给出 value [undefined × 1]。根据这个答案,这意味着数组具有未初始化的索引——在这种情况下,只有一个。但是,由于我只是array.push()用来避免这种问题,我有点迷路了。据我所知,仅分配一个索引至少比其他初始化索引大一个索引可能会导致问题。无论如何,这是代码:

function Thing(params) {
    var that = this;

    this.OtherObject = function OtherObject(param) {
        this.param = param;
    }

    this.Foo = function Foo() {
        this.bar = [];

        this.add = function(item) {
            if (this.bar.length != 0) {
                for (var i = 0, len = this.bar.length; i < len; i++) {
                    if (this.bar[i].param <= item.param) {
                        this.bar.splice(i, 0, item);
                    }
                }
            } else {
                this.bar[0] = item;
                console.log(this.bar);
            }
        }

        this.pop = function() {
            return this.bar.pop();
        }

        this.length = function() {
            return this.bar.length;
        }
    }

    this.someFunc = function() {
        var myThing = new that.Foo();
        myThing.add(new that.OtherObject(3));

        while (myThing.length() > 0) {
            var someVar = myThing.pop();
        }
    }
}

var myThing = new Thing({
    myParam: "someValue"
});

myThing.someFunc();
​

我创建了一个测试用例来查看是否可以缩小问题范围,但最终我重新输入了 95% 的代码,直到我再次遇到问题,这似乎与我使用myThing.pop(). 你可以在这里找到一个演示问题的小提琴。

所以......关于什么可能导致这种情况的任何想法?这实际上是我嵌套对象的方式的问题吗?(我按照我的上一个问题的答案中给我的模式做的)。

如果您想知道我可能在这里尝试做什么,我将外部对象视为一种命名空间,我这样做是为了避免混淆全局命名空间(这最终将成为一个寻路库,如果我在这里一起行动)。该Foo对象是一种有序列表,这样我可以通过堆栈获得最近的节点(具有最低param属性的节点) 。pop()

4

1 回答 1

2

console.log谷歌浏览器的功能发生了一些非常奇怪的事情。其他浏览器的行为似乎与您预期的一样。这是我见过的最奇怪的事情之一:如果你在调用alert的 lne 之后添加一个调用console.log,控制台中会有不同的输出。

console.log(this.bar);
alert(this.bar);

// [> OtherObject]

如您所见,如果删除alert,控制台将输出

// [undefined × 1] 

alert这类事情要么是由于某种竞争条件,要么是由于函数引起的一些副作用。这是我对幕后发生的事情的理论:

  • console.log函数实际上不会在控制台中记录值,直到代码暂停,然后它会记录所有排队的消息。队列包含对要记录的消息的引用。
  • this.bar弹出数组时,其中的第一项被销毁。记录器,除非有一些中断,否则会在引用的值被销毁后显示消息。因此,它显示[undefined × 1]
  • 调用alert会导致代码暂停,以便控制台可以在删除引用的值之前记录消息。

I'm still not completely sure if this is really what's happening, but it seems to be somwhat reasonable. I'll do some more testing to check if my theory is correct.

于 2012-05-26T04:01:46.027 回答