Het doorgeven van een ouder element aan een module via closures in JavaScript
Stel we hebben de volgende elementen:
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="res"></div>
<button id="btn">click me</button>
Stel dat de volgende module met deze elementen werkt:
;(function(selector1, selector2, selector3, selector4, selector5) {
let div1 = document.querySelector(selector1);
let div2 = document.querySelector(selector2);
let div3 = document.querySelector(selector3);
let res = document.querySelector(selector4);
let btn = document.querySelector(selector5);
btn.addEventListener('click', function() {
let num1 = Number(div1.textContent);
let num2 = Number(div2.textContent);
let num3 = Number(div3.textContent);
res.textContent = num1 + num2 + num3;
});
})('#div1', '#div2', '#div3', '#res', '#btn');
Zoals je ziet, is het aantal parameters dat aan de module wordt doorgegeven enigszins groot en veroorzaakt het ongemak. Meestal wordt in dit geval als volgt gehandeld: men geeft een gemeenschappelijke ouder van alle elementen waarmee onze module werkt aan de module door, en binnen de module worden vervolgens verschillende elementen uit deze ouder gehaald.
Laten we een gemeenschappelijke ouder voor onze tags maken:
<div id="parent">
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="res"></div>
<button id="btn">click me</button>
</div>
Laten we nu de code van de module aanpassen:
;(function(root) {
let parent = document.querySelector(root);
let div1 = parent.querySelector('#div1');
let div2 = parent.querySelector('#div2');
let div3 = parent.querySelector('#div3');
let res = parent.querySelector('#res');
let btn = parent.querySelector('#btn');
btn.addEventListener('click', function() {
let num1 = Number(div1.textContent);
let num2 = Number(div2.textContent);
let num3 = Number(div3.textContent);
res.textContent = num1 + num2 + num3;
});
})('#parent');
Zo zal het blijken dat we het ouder element van buitenaf aan de module doorgeven en het gemakkelijk kunnen veranderen. En de onderliggende elementen zijn een interne aangelegenheid van de module.