Javascript 除非调用console.log,否则循环引用父-子循环是未定义的 请考虑以下代码 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();

Javascript 除非调用console.log,否则循环引用父-子循环是未定义的 请考虑以下代码 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();,javascript,circular-reference,Javascript,Circular Reference,每次在contenteditable div中进行DOM修改(变异)时,都会触发此代码,并导致一个错误,指出observer obj.context未定义 但是,如果我取消注释这一行//console.log(this.observer);//->这一行,不会产生任何错误,并且工作正常 为什么? 这是我的建议。要复制,请在文本后的contenteditable div中按ENTER键 注意:如果有人对如何在没有循环引用的情况下将上下文传递给mutationObserver(或给出正确的范围)提

每次在contenteditable div中进行DOM修改(变异)时,都会触发此代码,并导致一个错误,指出observer obj.context未定义

但是,如果我取消注释这一行
//console.log(this.observer);//->这一行
,不会产生任何错误,并且工作正常

为什么?

这是我的建议。要复制,请在文本后的contenteditable div中按ENTER键


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

您可以使用来保持正确的

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

试试看:

我已经玩了一点JSFIDLE。有时它在没有console.log的情况下工作,有时不工作。真奇怪。我使用铬22.0.1229。94@Barmaley.exe是的,我也注意到了。。。我真的不明白为什么。尽管其想法是稍后将函数绑定到另一个对象(触发事件的实际对象)。我想我可以重构代码并使用某种事件中介,但这真的很奇怪。可能是变异观察者中的一个bug,它似乎与铬/铬有关。我确信我可以在firefox上复制它。。。