JavaScript构造函数参数

时间:2016-04-14 13:54:34

标签: javascript constructor arguments

任何人都可以向我解释一下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>

2 个答案:

答案 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'