2016-04-14 71 views
0

会有人请向我解释JavaScript的构造究竟是如何工作的?具体来说,我说的是以下情况:JavaScript构造参数

在我Webside代码我有两个要素,我需要一个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*/ 
} 

和它的工作就好了。

而且这里的东西我真的不明白:我如何传递的东西作为参数传递给构造函数,如果构造的结果是我想要使用的参数...?

回答

0

您可以通过实际使用之前声明变量做到这一点。

例如:使用Javascript的

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

新版本实际上是为你做这个,这个概念被称为吊装。这就是为什么这是有效的。

+0

OP的当前代码没有什么区别。 – deceze

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'