除非调用console.log,否则未定义循环引用父子关系
Circular reference parent-child is undefined unless console.log is called
请考虑以下代码
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.text未定义。
但是,如果我取消对这一行//console.log(this.observer); //->THIS LINE
的注释,则不会产生任何错误,并且它可以按预期工作。
为什么?
这是JSFiddle。要复制,请在文本后面的contenteditablediv中按ENTER键。
注意:如果有人建议如何在没有循环引用的情况下将上下文传递给mutationObserver(或给出正确的范围),我也将不胜感激。
您可以使用函数#bind来保持正确的this
:
this.observer = new MutationObserver(this.mutationObserver.bind(this));
试试看:http://jsfiddle.net/reLr9/
相关文章:
- 为什么“;未定义的“;在JavaScript中结束循环
- $.每个jquery循环打印一个“;未定义的“;对于getJSON请求后的每个元素,网格数据都会完美地打印出来
- 使用arr[i]循环遍历数组==未定义
- 为什么在循环中返回时函数返回值未定义
- 未捕获的类型错误:未定义不是函数,在中为循环创建了对象
- Waypoint的循环,退出循环后属性未定义
- 对象在循环中运行时未定义,但在按顺序执行时未定义
- 使用while循环在printArray函数中获取一个额外的未定义值
- 如何使此循环工作?它's返回未定义的语言js
- Javascript数组中未定义的值是否使用任何内存或在for in循环中迭代
- 未捕获的typeerror无法读取属性'0'for循环中未定义的
- 使用jQuery'在数组中循环;s中的每一个都会在生成字符串时在开头产生一个未定义的值
- 嵌套的“for”循环 - 数组未定义
- 在 For 循环中的闭包中未定义
- javascript 中的框架对象循环是未定义的
- 为什么以下 forEach 数组循环未返回未定义
- 当在 Javascript 中使用许多 for 循环时,输出是未定义的
- 用于从许多带有“for”循环的URL中获取HTML信息的X射线使对象未定义
- 当我把它放到setInterval循环中时,event.clientY是未定义的
- 除非调用console.log,否则未定义循环引用父子关系