除非调用console.log,否则循环引用父子是未定义的

时间:2013-02-06 13:23:25

标签: javascript circular-reference

请考虑以下代码

    var factory = function (element, opts) {
        var MutationObserverController = function (element, opts) {
            var defaults = {
                subtree: true,
                childList: true,
                characterData: true
            };

            this.options = $.extend({}, defaults, opts);
            this.watchedElement = element;

            this.observer = new MutationObserver(this.mutationObserver);
            this.observer.context = this;
            //console.log(this.observer); //->THIS LINE
        };

        MutationObserverController.prototype.connect = function () {
            this.observer.observe(this.watchedElement, this.options);
        };

        MutationObserverController.prototype.disconnect = function () {
            this.observer.disconnect();
        };

        MutationObserverController.prototype.mutationObserver = function (mutations, observerObj) {
            var ctx = observerObj.context;
            ctx.disconnect();
            mutations.forEach(function (m) {
                console.log(m);
            });
            ctx.connect();
        };

        return new MutationObserverController(element, opts);
    };

    var mutOb = factory($('#myEditor').get(0), {});
    mutOb.connect();

每次在一个可信任的div中完成DOM修改(变异)时,都会触发此代码,并且它会产生错误,指出observerObj.context未定义

但是,如果我取消注释此行//console.log(this.observer); //->THIS LINE,则不会产生任何错误,并且它会按预期工作。

为什么?

这是JSFiddle。要重现,请在文本后面的contenteditable div中按ENTER键。


注意:如果有人建议如何在没有循环引用的情况下将上下文传递给mutationObserver(或给出正确的范围),我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用Function#bind来保持正确this

this.observer = new MutationObserver(this.mutationObserver.bind(this));

试一试:http://jsfiddle.net/reLr9/