任何人都可以向我解释一下JavaScript构造函数究竟是如何工作的吗?具体来说,我在谈论以下情况:
在我的Webside Code中,我有两个元素,我需要使用MutationObserver观察。我尝试只使用一个Observer,但这不起作用。所以我提出了以下解决方案:
var observer = new MutationObserver(function (mutations) { /*Code to do stuff */ });
var observer2 = new MutationObserver(function (mutations) { /*Code to do stuff */ });
然后我给了他们一些观察的东西:
observer.observe(document.getElementById("textarea1"), {attributs: true, attributeFilter: ['style'] });
observer2.observe(document.getElementById("textarea2"), {attributs: true, attributeFilter: ['style'] });
有了这个观察者,我想改变风格,因为我会得到一个无限循环,我告诉观察者.disconnect(),改变了风格,然后让它再次开始观察。
因为" textarea1"和" textarea2"基本上是相同的(但内容不同),我不想两次使用相同的代码,唯一的区别是要调用的特定观察者对象。
所以我尝试了以下内容:
var observer = new MutationObserver(function (mutations) {
mutate(mutations, observer);
});
var observer2 = new MutationObserver(function (mutations) {
mutate(mutations, observer2);
});
function mutate(mutations, observer) {
/*do stuff with mutations and observer*/
}
它运作得很好。
这就是我不能得到的东西:如果构造函数的结果是我想要使用的参数,我如何将某些东西作为参数传递给构造函数??< / p>
答案 0 :(得分:0)
您可以在实际使用变量之前声明变量。
示例:
var observer, observer2, mutate;
observer = new MutationObserver(function (mutations) {
mutate(mutations, observer);
});
observer2 = new MutationObserver(function (mutations) {
mutate(mutations, observer2);
});
mutate = function (mutations, observer) {
/*do stuff with mutations and observer*/
}
较新版本的Javascript实际上是为您执行此操作,该概念称为提升。这就是为什么这样做的原因。
答案 1 :(得分:0)
所有var
声明都会被提升,这意味着您的代码相当于:
var observer;
observer = new ...
变量名observer
从一开始就存在于范围内。
从那里你只有这个:
var observer;
function () {
foo(observer);
}
这完全是合法代码。您正在定义一个函数,该函数在被调用时使用父作用域中的变量observer
执行某些操作。该变量仅在调用时进行评估,因此当时的值非常重要。由于之后某个时间被称为,因此您已将某些内容分配给observer
,这样就可以了。
类似的说明性例子:
var foo;
setTimeout(function () { alert(foo); });
foo = 'bar';
此警报bar
,因为在执行回调时 ,foo
保留值'bar'
。