JavaScriptã®ã³ã³ã«ã¬ã³ããããã®åãæ¢æ±ããå¹ççãªäžŠåããŒã¿åŠçãå®çŸããã®é«åºŠãªããŒã¿æ§é ãå®è£ ã»æŽ»çšããŠã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããæ¹æ³ãåŠã³ãŸãã
JavaScriptã®ã³ã³ã«ã¬ã³ããããïŒçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã«ããã䞊åããŒã¿åŠç
仿¥ã®ããŒã¿éçŽåãé²ãäžçã§ã¯ãå¹ççãªããŒã¿åŠçã®å¿ èŠæ§ãæãéèŠã§ããJavaScriptã¯äŒçµ±çã«ã·ã³ã°ã«ã¹ã¬ããã§ãããäžŠè¡æ§ãšäžŠåæ§ãå®çŸããããã®ãã¯ããã¯ã掻çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãããã®ãããªãã¯ããã¯ã®1ã€ã«ã䞊åã¢ã¯ã»ã¹ãšå€æŽã®ããã«èšèšãããããŒã¿æ§é ã§ããã³ã³ã«ã¬ã³ããããã®äœ¿çšããããŸãã
䞊è¡ããŒã¿æ§é ã®å¿ èŠæ§ã®çè§£
JavaScriptã®ã€ãã³ãã«ãŒãã¯éåææäœã®åŠçã«é©ããŠããŸãããæ¬è³ªçã«çã®äžŠåæ§ãæäŸãããã®ã§ã¯ãããŸãããç¹ã«èšç®éã®å€ãã¿ã¹ã¯ã§ãè€æ°ã®æäœãå ±æããŒã¿ã«ã¢ã¯ã»ã¹ããŠå€æŽããå¿ èŠãããå Žåãæšæºã®JavaScriptãªããžã§ã¯ãïŒããããšããŠäœ¿çšïŒãããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã䞊è¡ããŒã¿æ§é ã¯ãè€æ°ã®ã¹ã¬ãããããã»ã¹ãããŒã¿ã®ç Žæãç«¶åç¶æ ãåŒãèµ·ããããšãªããåæã«ããŒã¿ã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããããã«ããããšã§ããã®åé¡ã«å¯ŸåŠããŸãã
ãªã¢ã«ã¿ã€ã ã®æ ªåŒååŒã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã·ããªãªãæ³åããŠã¿ãŠãã ãããè€æ°ã®ãŠãŒã¶ãŒãåæã«æ ªäŸ¡ã«ã¢ã¯ã»ã¹ããæŽæ°ããŠããŸããäŸ¡æ ŒããããšããŠæ©èœããéåžžã®JavaScriptãªããžã§ã¯ãã§ã¯ãããããäžæŽåãçããã§ããããã³ã³ã«ã¬ã³ããããã¯ãé«ãäžŠè¡æ§ããã£ãŠããåãŠãŒã¶ãŒãæ£ç¢ºã§ææ°ã®æ å ±ã確å®ã«é²èЧã§ããããã«ããŸãã
ã³ã³ã«ã¬ã³ãããããšã¯ïŒ
ã³ã³ã«ã¬ã³ããããã¯ãè€æ°ã®ã¹ã¬ãããŸãã¯ããã»ã¹ããã®åæã¢ã¯ã»ã¹ããµããŒãããããŒã¿æ§é ã§ããæšæºã®JavaScriptãªããžã§ã¯ããšã¯ç°ãªããè€æ°ã®æäœãåæã«å®è¡ããããšãã«ããŒã¿ã®æŽåæ§ãä¿èšŒããã¡ã«ããºã ãçµã¿èŸŒãŸããŠããŸããã³ã³ã«ã¬ã³ããããã®äž»ãªç¹åŸŽã¯æ¬¡ã®ãšããã§ãã
- ååæ§ïŒãããã«å¯Ÿããæäœã¯ã¢ãããã¯ã§ãããåäžã®äžå¯åãªåäœãšããŠå®è¡ãããããšãæå³ããŸããããã«ãããéšåçãªæŽæ°ã鲿¢ãããããŒã¿ã®äžè²«æ§ãä¿èšŒãããŸãã
- ã¹ã¬ããã»ãŒããã£ïŒãã®ãããã¯ã¹ã¬ããã»ãŒãã«èšèšãããŠãããããŒã¿ã®ç Žæãç«¶åç¶æ ãåŒãèµ·ããããšãªããè€æ°ã®ã¹ã¬ããã«ãã£ãŠåæã«å®å šã«ã¢ã¯ã»ã¹ããã³å€æŽã§ããããšãæå³ããŸãã
- ããã¯ã¡ã«ããºã ïŒå éšçã«ãã³ã³ã«ã¬ã³ããããã¯ãã°ãã°ããã¯ã¡ã«ããºã ïŒäŸïŒãã¥ãŒããã¯ã¹ãã»ããã©ïŒã䜿çšããŠãåºã«ãªãããŒã¿ãžã®ã¢ã¯ã»ã¹ãåæãããŸããå®è£ ã«ãã£ãŠã现ç²åºŠããã¯ïŒãããã®ç¹å®ã®éšåã®ã¿ãããã¯ããïŒãç²ç²åºŠããã¯ïŒãããå šäœãããã¯ããïŒãªã©ãç°ãªãããã¯æŠç¥ãæ¡çšãããå ŽåããããŸãã
- ãã³ããããã³ã°æäœïŒäžéšã®ã³ã³ã«ã¬ã³ããããå®è£ ã§ã¯ããã³ããããã³ã°æäœãæäŸãããŠãããã¹ã¬ãããããã¯ãåŸ ããã«æäœã詊ã¿ãããšãã§ããŸããããã¯ãå©çšã§ããªãå Žåãæäœã¯ããã«å€±æããããåŸã§å詊è¡ããããšãã§ããŸããããã«ãããç«¶åãæžãããŠããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
JavaScriptã§ã®ã³ã³ã«ã¬ã³ããããã®å®è£
JavaScriptã«ã¯ãä»ã®ããã€ãã®èšèªïŒäŸïŒJavaãGoïŒã®ããã«çµã¿èŸŒã¿ã®ã³ã³ã«ã¬ã³ããããããŒã¿æ§é ã¯ãããŸããããããŸããŸãªãã¯ããã¯ã䜿çšããŠå®è£ ããããšãã§ããŸãã以äžã«ããã€ãã®ã¢ãããŒãã瀺ããŸãã
1. AtomicsãšSharedArrayBufferã䜿çšãã
SharedArrayBufferãšAtomics APIã¯ãç°ãªãJavaScriptã³ã³ããã¹ãïŒäŸïŒWeb WorkerïŒéã§ã¡ã¢ãªãå
±æãããã®ã¡ã¢ãªã«å¯ŸããŠã¢ãããã¯æäœãå®è¡ããæ¹æ³ãæäŸããŸããããã«ããããããããŒã¿ãSharedArrayBufferã«ä¿åããAtomicsã䜿çšããŠã¢ã¯ã»ã¹ãåæãããããšã§ãã³ã³ã«ã¬ã³ãããããæ§ç¯ã§ããŸãã
// SharedArrayBufferãšAtomicsã䜿çšããäŸïŒèª¬æçšïŒ
const buffer = new SharedArrayBuffer(1024);
const intView = new Int32Array(buffer);
function set(key, value) {
// ããã¯ã¡ã«ããºã ïŒç°¡ç¥çïŒ
Atomics.wait(intView, 0, 1); // ã¢ã³ããã¯ããããŸã§åŸ
æ©
Atomics.store(intView, 0, 1); // ããã¯
// ããŒãšå€ã®ãã¢ãä¿åïŒäŸãšããŠåçŽãªç·åœ¢æ¢çŽ¢ã䜿çšïŒ
// ...
Atomics.store(intView, 0, 0); // ã¢ã³ããã¯
Atomics.notify(intView, 0, 1); // åŸ
æ©äžã®ã¹ã¬ããã«éç¥
}
function get(key) {
// ããã¯ã¡ã«ããºã ïŒç°¡ç¥çïŒ
Atomics.wait(intView, 0, 1); // ã¢ã³ããã¯ããããŸã§åŸ
æ©
Atomics.store(intView, 0, 1); // ããã¯
// å€ãååŸïŒäŸãšããŠåçŽãªç·åœ¢æ¢çŽ¢ã䜿çšïŒ
// ...
Atomics.store(intView, 0, 0); // ã¢ã³ããã¯
Atomics.notify(intView, 0, 1); // åŸ
æ©äžã®ã¹ã¬ããã«éç¥
}
éèŠïŒSharedArrayBufferã䜿çšããã«ã¯ãç¹ã«SpectreãMeltdownã®è匱æ§ã«é¢ããã»ãã¥ãªãã£äžã®åœ±é¿ãæ
éã«èæ
®ããå¿
èŠããããŸãããããã®ãªã¹ã¯ã軜æžããããã«ãé©åãªã¯ãã¹ãªãªãžã³åé¢ããããŒïŒCross-Origin-Embedder-Policyããã³Cross-Origin-Opener-PolicyïŒãæå¹ã«ããå¿
èŠããããŸãã
2. Web Workerãšã¡ãã»ãŒãžããã·ã³ã°ã䜿çšãã
Web Workerã䜿çšãããšãã¡ã€ã³ã¹ã¬ãããšã¯å¥ã«ããã¯ã°ã©ãŠã³ãã§JavaScriptã³ãŒããå®è¡ã§ããŸããã³ã³ã«ã¬ã³ããããããŒã¿ã管çããããã®å°çšã®Web Workerãäœæããã¡ãã»ãŒãžããã·ã³ã°ã䜿çšããŠéä¿¡ããããšãã§ããŸãããã®ã¢ãããŒãã¯ãããçšåºŠã®äžŠè¡æ§ãæäŸããŸãããã¡ã€ã³ã¹ã¬ãããšã¯ãŒã«ãŒéã®éä¿¡ã¯éåæã§ãã
// ã¡ã€ã³ã¹ã¬ãã
const worker = new Worker('concurrent-map-worker.js');
worker.postMessage({ type: 'set', key: 'foo', value: 'bar' });
worker.addEventListener('message', (event) => {
console.log('ã¯ãŒã«ãŒããåä¿¡ïŒ', event.data);
});
// concurrent-map-worker.js
const map = {};
self.addEventListener('message', (event) => {
const { type, key, value } = event.data;
switch (type) {
case 'set':
map[key] = value;
self.postMessage({ type: 'ack', key });
break;
case 'get':
self.postMessage({ type: 'result', key, value: map[key] });
break;
// ...
}
});
ãã®äŸã¯ãç°¡ç¥åãããã¡ãã»ãŒãžããã·ã³ã°ã®ã¢ãããŒãã瀺ããŠããŸããå®éã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããšã©ãŒæ¡ä»¶ãåŠçããã¯ãŒã«ãŒå ã§ããé«åºŠãªããã¯ã¡ã«ããºã ãå®è£ ãããªãŒããŒããããæå°éã«æããããã«éä¿¡ãæé©åããå¿ èŠããããŸãã
3. ã©ã€ãã©ãªã䜿çšããïŒäŸïŒãã€ãã£ãå®è£ ã®ã©ãããŒïŒ
JavaScriptãšã³ã·ã¹ãã ã§çŽæ¥`SharedArrayBuffer`ã`Atomics`ãæäœããããšã¯ããŸãäžè¬çã§ã¯ãããŸããããæŠå¿µçã«é¡äŒŒããããŒã¿æ§é ã¯ãNode.jsã®ãã€ãã£ãæ¡åŒµæ©èœãWASMã¢ãžã¥ãŒã«ã掻çšãããµãŒããŒãµã€ãã®JavaScriptç°å¢ã§å ¬éãããå©çšãããŠããŸãããããã¯ãã°ãã°é«æ§èœãªãã£ãã·ã³ã°ã©ã€ãã©ãªã®åºç€ã§ãããå éšã§äžŠè¡æ§ãåŠçããMapã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ãå ¬éããããšããããŸãã
ããã«ããå©ç¹ã¯æ¬¡ã®ãšããã§ãã
- ããã¯ãããŒã¿æ§é ã«ãã€ãã£ãã®ããã©ãŒãã³ã¹ã掻çšã§ããã
- ããé«ã¬ãã«ã®æœè±¡åã䜿çšããéçºè ã«ãšã£ãŠãAPIããã°ãã°ããã·ã³ãã«ã«ãªãã
å®è£ ãéžæããéã®èæ ®äºé
å®è£ ã®éžæã¯ãããã€ãã®èŠå ã«äŸåããŸãã
- ããã©ãŒãã³ã¹èŠä»¶ïŒçµ¶å¯Ÿçã«æé«ã®ããã©ãŒãã³ã¹ãå¿
èŠãªå Žåã¯ã
SharedArrayBufferãšAtomicsïŒãŸãã¯ãããã®ããªããã£ããå éšã§å©çšããWASMã¢ãžã¥ãŒã«ïŒã䜿çšããã®ãæåã®éžæè¢ãããããŸãããããšã©ãŒãã»ãã¥ãªãã£ã®è匱æ§ãé¿ããããã«æ éãªã³ãŒãã£ã³ã°ãå¿ èŠã§ãã - è€éãïŒWeb Workerãšã¡ãã»ãŒãžããã·ã³ã°ã䜿çšããæ¹ããäžè¬çã«
SharedArrayBufferãšAtomicsãçŽæ¥äœ¿çšãããããå®è£ ããããã°ãç°¡åã§ãã - äžŠè¡æ§ã¢ãã«ïŒå¿
èŠãªäžŠè¡æ§ã®ã¬ãã«ãèæ
®ããŠãã ãããããã€ãã®äžŠè¡æäœãå®è¡ããã ãã§ããã°ãWeb Workerã§ååãããããŸãããé«åºŠã«äžŠè¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
SharedArrayBufferãšAtomicsãŸãã¯ãã€ãã£ãæ¡åŒµæ©èœãå¿ èŠã«ãªãå ŽåããããŸãã - ç°å¢ïŒWeb Workerã¯ãã©ãŠã¶ãšNode.jsã§ãã€ãã£ãã«åäœããŸãã
SharedArrayBufferã«ã¯ç¹å®ã®ããããŒãå¿ èŠã§ãã
JavaScriptã«ãããã³ã³ã«ã¬ã³ããããã®ãŠãŒã¹ã±ãŒã¹
ã³ã³ã«ã¬ã³ããããã¯ã䞊åããŒã¿åŠçãå¿ èŠãªããŸããŸãªã·ããªãªã§æçã§ãã
- ãªã¢ã«ã¿ã€ã ããŒã¿åŠçïŒæ ªåŒååŒãã©ãããã©ãŒã ããœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒããã»ã³ãµãŒãããã¯ãŒã¯ãªã©ããªã¢ã«ã¿ã€ã ã®ããŒã¿ã¹ããªãŒã ãåŠçããã¢ããªã±ãŒã·ã§ã³ã¯ãã³ã³ã«ã¬ã³ãããããå©çšããŠåææŽæ°ãã¯ãšãªãå¹ççã«åŠçã§ããŸããäŸãã°ãé éè»äž¡ã®äœçœ®ããªã¢ã«ã¿ã€ã ã§è¿œè·¡ããã·ã¹ãã ã§ã¯ãè»äž¡ãç§»åããã«ã€ããŠããããåæã«æŽæ°ããå¿ èŠããããŸãã
- ãã£ãã·ã³ã°ïŒã³ã³ã«ã¬ã³ããããã䜿çšããŠãè€æ°ã®ã¹ã¬ãããããã»ã¹ããåæã«ã¢ã¯ã»ã¹ã§ãã髿§èœãªãã£ãã·ã¥ãå®è£ ã§ããŸããããã«ãããWebãµãŒããŒãããŒã¿ããŒã¹ããã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸããäŸãã°ãé«ãã©ãã£ãã¯ã®Webã¢ããªã±ãŒã·ã§ã³ã§ãããŒã¿ããŒã¹ããé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ããã£ãã·ã¥ããŠã¬ã€ãã³ã·ãåæžããŸãã
- 䞊åèšç®ïŒç»ååŠçãç§åŠã·ãã¥ã¬ãŒã·ã§ã³ãæ©æ¢°åŠç¿ãªã©ãèšç®éã®å€ãã¿ã¹ã¯ãå®è¡ããã¢ããªã±ãŒã·ã§ã³ã¯ãã³ã³ã«ã¬ã³ããããã䜿çšããŠäœæ¥ãè€æ°ã®ã¹ã¬ãããããã»ã¹ã«åæ£ããçµæãå¹ççã«éçŽã§ããŸããäŸãšããŠã倧ããªç»åã䞊ååŠçããåã¹ã¬ãããç°ãªãé åãæ åœããŠäžéçµæãã³ã³ã«ã¬ã³ããããã«ä¿åããå ŽåããããŸãã
- ã²ãŒã éçºïŒãã«ããã¬ã€ã€ãŒã²ãŒã ã§ã¯ãè€æ°ã®ãã¬ã€ã€ãŒã«ãã£ãŠåæã«ã¢ã¯ã»ã¹ã»æŽæ°ãããå¿ èŠãããã²ãŒã ã®ç¶æ ã管çããããã«ãã³ã³ã«ã¬ã³ããããã䜿çšã§ããŸãã
- 忣ã·ã¹ãã ïŒåæ£ã·ã¹ãã ãæ§ç¯ããéãã³ã³ã«ã¬ã³ããããã¯è€æ°ããŒãã«ãŸãããç¶æ ãå¹ççã«ç®¡çããããã®åºæ¬çãªæ§æèŠçŽ ãšãªãããšããããããŸãã
ã³ã³ã«ã¬ã³ããããã䜿çšããã¡ãªãã
ã³ã³ã«ã¬ã³ããããã䜿çšãããšã䞊è¡ç°å¢ã«ãããŠåŸæ¥ã®ããŒã¿æ§é ãããããã€ãã®å©ç¹ããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒã³ã³ã«ã¬ã³ããããã¯äžŠåããŒã¿ã¢ã¯ã»ã¹ãšå€æŽãå¯èœã«ãããã«ãã¹ã¬ãããŸãã¯ãã«ãããã»ã¹ã¢ããªã±ãŒã·ã§ã³ã§å€§å¹ ãªããã©ãŒãã³ã¹åäžããããããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åŒ·åïŒã³ã³ã«ã¬ã³ããããã«ãããäœæ¥è² è·ãè€æ°ã®ã¹ã¬ãããŸãã¯ããã»ã¹ã«åæ£ãããããšã§ãã¢ããªã±ãŒã·ã§ã³ããã广çã«ã¹ã±ãŒã«ã§ããããã«ãªããŸãã
- ããŒã¿ã®äžè²«æ§ïŒã³ã³ã«ã¬ã³ããããã¯ãã¢ãããã¯æäœãšã¹ã¬ããã»ãŒããã£ã¡ã«ããºã ãæäŸããããšã«ãããããŒã¿ã®æŽåæ§ãšäžè²«æ§ãä¿èšŒããŸãã
- ã¬ã€ãã³ã·ã®åæžïŒããŒã¿ãžã®åæã¢ã¯ã»ã¹ãèš±å¯ããããšã§ãã³ã³ã«ã¬ã³ããããã¯ã¬ã€ãã³ã·ãåæžããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããããšãã§ããŸãã
ã³ã³ã«ã¬ã³ããããã䜿çšããéã®èª²é¡
ã³ã³ã«ã¬ã³ããããã¯å€§ããªå©ç¹ãæäŸããŸãããããã€ãã®èª²é¡ãæç€ºããŸãã
- è€éãïŒã³ã³ã«ã¬ã³ããããã®å®è£ ãšäœ¿çšã¯ãåŸæ¥ã®ããŒã¿æ§é ã䜿çšãããããè€éã«ãªãå¯èœæ§ããããããã¯ã¡ã«ããºã ãã¹ã¬ããã»ãŒããã£ãããŒã¿ã®äžè²«æ§ãæ éã«èæ ®ããå¿ èŠããããŸãã
- ãããã°ïŒã¹ã¬ããå®è¡ã®é決å®çãªæ§è³ªã®ããã䞊è¡ã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã¯å°é£ãªå ŽåããããŸãã
- ãªãŒããŒãããïŒããã¯ã¡ã«ããºã ãšåæããªããã£ãã¯ãªãŒããŒããããçºçãããå¯èœæ§ããããæ éã«äœ¿çšããªããšããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããšããããŸãã
- ã»ãã¥ãªãã£ïŒ
SharedArrayBufferã䜿çšããå Žåãé©åãªã¯ãã¹ãªãªãžã³åé¢ããããŒãæå¹ã«ããããšã§ãSpectreãMeltdownã®è匱æ§ã«é¢é£ããã»ãã¥ãªãã£äžã®æžå¿µã«å¯ŸåŠããããšãäžå¯æ¬ ã§ãã
ã³ã³ã«ã¬ã³ãããããæ±ãéã®ãã¹ããã©ã¯ãã£ã¹
ã³ã³ã«ã¬ã³ããããã广çã«äœ¿çšããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- äžŠè¡æ§ã®èŠä»¶ãçè§£ããïŒã¢ããªã±ãŒã·ã§ã³ã®äžŠè¡æ§èŠä»¶ãæ³šææ·±ãåæããé©åãªã³ã³ã«ã¬ã³ããããå®è£ ãšããã¯æŠç¥ã決å®ããŸãã
- ããã¯ã®ç«¶åãæå°éã«æããïŒå¯èœãªéã现ç²åºŠã®ããã¯ããã³ããããã³ã°æäœã䜿çšããŠãããã¯ã®ç«¶åãæå°éã«æããããã«ã³ãŒããèšèšããŸãã
- ãããããã¯ãåé¿ããïŒãããããã¯ã®å¯èœæ§ãèªèããããã¯ã®é åºä»ããã¿ã€ã ã¢ãŠãã®äœ¿çšãªã©ãããããé²ãããã®æŠç¥ãå®è£ ããŸãã
- 培åºçã«ãã¹ãããïŒæœåšçãªç«¶åç¶æ ãããŒã¿ã®äžè²«æ§ã®åé¡ãç¹å®ã解決ããããã«ã䞊è¡ã³ãŒãã培åºçã«ãã¹ãããŸãã
- é©åãªããŒã«ã䜿çšããïŒãããã°ããŒã«ãããã©ãŒãã³ã¹ãããã¡ã€ã©ã䜿çšããŠã䞊è¡ã³ãŒãã®åäœãåæããæœåšçãªããã«ããã¯ãç¹å®ããŸãã
- ã»ãã¥ãªãã£ãåªå
ããïŒ
SharedArrayBufferã䜿çšããå Žåã¯ãé©åãªã¯ãã¹ãªãªãžã³åé¢ããããŒãæå¹ã«ããè匱æ§ãé²ãããã«ããŒã¿ãæ éã«æ€èšŒããããšã§ãã»ãã¥ãªãã£ãåªå ããŸãã
çµè«
ã³ã³ã«ã¬ã³ããããã¯ãJavaScriptã§é«æ§èœãã€ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ããå€å°ã®è€éãã䌎ããŸãããããã©ãŒãã³ã¹ã®åäžãã¹ã±ãŒã©ããªãã£ã®åŒ·åãããŒã¿ã®äžè²«æ§ãšãã£ãå©ç¹ã¯ãããŒã¿éçŽåã®ã¢ããªã±ãŒã·ã§ã³ã«åãçµãéçºè ã«ãšã£ãŠè²Žéãªè³ç£ãšãªããŸããäžŠè¡æ§ã®ååãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã³ã³ã«ã¬ã³ããããã广çã«æŽ»çšããŠãå ç¢ã§å¹ççãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
ãªã¢ã«ã¿ã€ã ã§ããŒã¿é§ååã®ã¢ããªã±ãŒã·ã§ã³ãžã®éèŠãé«ãŸãç¶ããã«ã€ããŠãã³ã³ã«ã¬ã³ããããã®ãããªäžŠè¡ããŒã¿æ§é ãçè§£ãå®è£ ããããšã¯ãJavaScriptéçºè ã«ãšã£ãŠãŸããŸãéèŠã«ãªãã§ãããããããã®é«åºŠãªãã¯ããã¯ãåãå ¥ããããšã§ã次äžä»£ã®é©æ°çãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«JavaScriptã®å¯èœæ§ãæå€§éã«åŒãåºãããšãã§ããŸãã