gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:51:17 28 4
gpt4 key购买 nike

请考虑以下代码

    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(或给出正确的范围),我也将不胜感激。

最佳答案

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

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

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

关于javascript - 除非调用 console.log,否则循环引用父子未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14730172/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com