请考虑以下代码
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(或给出正确的范围),我将不胜感激。
答案 0 :(得分:1)
您可以使用Function#bind来保持正确this
:
this.observer = new MutationObserver(this.mutationObserver.bind(this));