JavaScript构造函数参数

JavaScript constructor arguments

本文关键字:参数 构造函数 JavaScript      更新时间:2023-09-26

有人能向我解释一下JavaScript构造函数到底是如何工作的吗?具体来说,我谈论的是以下场景:

在我的Web端代码中,我有两个元素,需要使用MutationObserver来观察。我试着只对一个观察者这样做,但没有成功。所以我提出了以下解决方案:

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"answers"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*/
}

而且效果很好。

还有一件事我真的不明白:如果构造函数的结果是我想使用的参数,我怎么能把一些东西作为参数传递给构造函数。。。?

您可以在实际使用变量之前通过声明变量来实现。

示例:

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的新版本实际上是为你做这件事的,这个概念叫做提升。这就是为什么这是有效的。

所有var声明都被挂起,这意味着您的代码等效于:

var observer;
observer = new ...

变量名称observer从一开始就存在于作用域中。

从那里你所拥有的就是:

var observer;
function () {
    foo(observer);
}

这完全是法律法规。您正在定义一个函数,当调用该函数时,该函数将使用父作用域中的变量observer执行某些操作。变量只在调用时求值,因此它的值在那个时候是很重要。由于它在之后的某个时候被称为,您已经为observer分配了一些东西,所以这很好。

类似的示例:

var foo;
setTimeout(function () { alert(foo); });
foo = 'bar';

这会提醒bar,因为执行回调时foo保持值'bar'