2016-04-14 68 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'