当它为空时

时间:2012-01-10 14:43:20

标签: javascript

我正在尝试为需要回调的函数实现一个简单的队列。我的问题是在flush方法中,当正在执行的操作是一些长时间运行的事情(在我的情况下,indexedDB调用)时,“this”为null。我以前从未经历过这种行为,所以请教育我发生了什么事情?

以下是代码:

var Queue = (function () {
    function Queue() {
    };

    Queue.prototype.items = [];
    Queue.prototype.results = [];
    Queue.prototype.add = function (action) {
        this.items.push(action);
    };
    Queue.prototype.complete = function () { };
    Queue.prototype.flush = function () {
        var args = Array.prototype.slice.call(arguments);
        if (args.length > 0) { this.results.push(args); }
        if (this.items.length > 0) {
            var action = this.items.shift();
            action.call(this);
        } else { // Complete, call back multi.
            var results = this.results;
            this.clear();
            this.complete(results);
        }
    };
    Queue.prototype.clear = function () {
        this.items = [];
        this.results = [];
    };

    Queue.create = function () {
        return new Queue;
    };

    return Queue;
})();

1 个答案:

答案 0 :(得分:1)

根据您提供的内容,我最好的猜测是您将Queue.prototype.flush 函数对象的引用传递给某个异步函数,因此它可以用作回调。如果这是真的,flush()就像这样调用:

function ayncFunction(callback) {
    // Do some stuff
    callback();
}
ayncFunction(myQueue.flush);

......而不是像这样:

myQueue.flush();

因为函数是单独调用的,而不是对象,this将被设置为window(除非你使用的是strict mode,在这种情况下它是undefined )。

您可以通过在函数中包含对myQueue.flush()的调用来解决问题,如下所示:

var myCallback = function() {
    myQueue.flush();
};
ayncFunction(myCallback);

这是有效的,因为myCallback成为myQueue周围的 closure

解决问题的另一种方法是使用 bind() 将函数绑定到其上下文(即应该调用它的对象)。