FinalizationRegistry
Baseline
åºãå©ç¨å¯è½
*
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2021å¹´4æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
* ãã®æ©è½ã®ä¸é¨ã¯ã対å¿ã¬ãã«ãç°ãªãå ´åãããã¾ãã
FinalizationRegistry ãªãã¸ã§ã¯ãã«ããããªãã¸ã§ã¯ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã§ååãããã¨ãã«ã³ã¼ã«ããã¯ãè¦æ±ãããã¨ãã§ãã¾ãã
解説
FinalizationRegistry ã¯ãã¬ã¸ã¹ããªã¼ã«ç»é²ããã¦ãããªãã¸ã§ã¯ããååï¼ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ï¼ãããæã«ãã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãè¦æ±ããæ¹æ³ãæä¾ãã¾ããï¼ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã¯ããã¡ã¤ãã©ã¤ã¶ã¼ãã¨å¼ã°ãããã¨ãããã¾ããï¼
ã¡ã¢: ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã¯ãéè¦ãªããã°ã©ã ãã¸ãã¯ã«ã¯ä½¿ç¨ããªãã§ãã ããã詳細ã¯ãã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã«é¢ããæ³¨æç¹ãåç §ãã¦ãã ããã
ã³ã¼ã«ããã¯ã§æ¸¡ãã¬ã¸ã¹ããªã¼ã使ãã¾ãã
const registry = new FinalizationRegistry((heldValue) => {
// â¦
});
次ã«ã register ã¡ã½ãããå¼ã³åºãã¦ãã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãè¡ããããªãã¸ã§ã¯ããç»é²ãããã®ãªãã¸ã§ã¯ãã¨ä¿æå¤ã渡ãã¾ãã
registry.register(target, "some value");
ã¬ã¸ã¹ããªã¼ã¯ããã®å¤ã¸ã®å¼·ãåç
§ãä¿æãã¾ãããããããã¨æ¬æ¥ã®ç®çãæãããªããªãããã§ãï¼ã¬ã¸ã¹ããªã¼ãå¼·ãåç
§ãä¿æãã¦ãã¾ãã¨ããã®å¤ã¯è§£æ¾ãããªããªãããï¼ãJavaScript ã§ããªãã¸ã§ã¯ããæªç»é²ã®ã·ã³ãã«ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªããããFinalizationRegistry ãªãã¸ã§ã¯ãã«ã¿ã¼ã²ããã¾ãã¯ãã¼ã¯ã³ã¨ãã¦ç»é²ãããã¨ãã§ãã¾ãã
target ãååãããå ´åãã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã¯ãæå®ããä¿æå¤ï¼ä¸è¨ã® "some value"ï¼ã§å¼ã³åºãããå¯è½æ§ãããã¾ããä¿æå¤ã¯ãããªããã£ãã§ããªãã¸ã§ã¯ãã§ãã undefined ã§ãã£ã¦ãæ§ãã¾ãããä¿æå¤ããªãã¸ã§ã¯ãã®å ´åãã¬ã¸ã¹ããªã¼ã¯ãã®å¤ã¸ã®å¼·ãåç
§ãä¿æãã¾ãï¼ããã«ãããå¾ã§ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã«æ¸¡ããã¨ãã§ãã¾ãï¼ã
ã¿ã¼ã²ããå¤ã®ç»é²ãè§£é¤ãããå ´åã¯ã3 çªç®ã®å¤ã渡ãã¾ãã ããã¯ãå¾ã§ã¬ã¸ã¹ããªã¼ã® unregister 颿°ãå¼ã³åºãã¦ããªãã¸ã§ã¯ãã®ç»é²ãè§£é¤ããéã«ä½¿ç¨ããç»é²è§£é¤ãã¼ã¯ã³ã§ããã¬ã¸ã¹ããªã¼ã¯ãç»é²è§£é¤ãã¼ã¯ã³ã¸ã®å¼±ãåç
§ã®ã¿ãä¿æãã¾ãã
ããã¿ã¼ã²ããå¤èªèº«ãç»é²è§£é¤ãã¼ã¯ã³ã¨ãã¦ä½¿ãããããã¯è¯ãçµæã«ãªãã¾ãã
registry.register(target, "some value", target);
// â¦
// ãã°ããçµã£ã¦ã`target` ãããå¿
è¦ã¨ããªããªã£ããããã®ç»é²ãè§£é¤ãã
registry.unregister(target);
ãã ããåããªãã¸ã§ã¯ãã§ããå¿ è¦ã¯ããã¾ãããç°ãªããã®ã§ãæ§ãã¾ããã
registry.register(target, "some value", token);
// â¦
// some time later
registry.unregister(token);
å¯è½ãªéãé¿ãã
FinalizationRegistry ã®æ£ãã使ç¨ã«ã¯æ
éãªæ¤è¨ãå¿
è¦ã§ãããå¯è½ã§ããã°ä½¿ç¨ãé¿ããã®ãæåã§ããåæã«ã仿§ä¸ä¿è¨¼ããã¦ããªãç¹å®ã®æåã«ä¾åããªããã¨ãéè¦ã§ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ããã¤ãã©ã®ããã«ãããã¦å®è¡ããããã©ããã¯ãå JavaScript ã¨ã³ã¸ã³ã®å®è£
ã«ä¾åãã¾ããããã¨ã³ã¸ã³ã§è¦³å¯ãããæåã¯ãå¥ã®ã¨ã³ã¸ã³ããåãã¨ã³ã¸ã³ã®å¥ã®ãã¼ã¸ã§ã³ããããã¯åããã¼ã¸ã§ã³ã®åãã¨ã³ã¸ã³ã§ãã£ã¦ããããã«ç°ãªãç¶æ³ä¸ã§ã¯ãç°ãªãå¯è½æ§ãããã¾ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¯å°é£ãªåé¡ã§ãããJavaScript ã¨ã³ã¸ã³ã®å®è£
è
ã¯ãã®è§£æ±ºçãçµ¶ããæ´ç·´ããæ¹åãç¶ãã¦ãã¾ãã
FinalizationRegistry ãå°å
¥ãã ææ¡ ã«ããã¦ã使è
ããè¨è¼ããå
·ä½çãªç¹ã¯æ¬¡ã®éãã§ãã
ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã¯è¤éã§ããã¢ããªã±ã¼ã·ã§ã³ãã©ã¤ãã©ãªã¼ããGC ã WeakRef ãã¯ãªã¼ã³ã¢ãããããããã¡ã¤ãã©ã¤ã¶ã¼ [ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯] ã驿ãã¤äºæ¸¬å¯è½ãªæ¹æ³ã§å¼ã³åºããããããã¨ã«ä¾åãã¦ããå ´åãæå¾ å¤ãã®çµæã«ãªãå¯è½æ§ãé«ãã§ããã¯ãªã¼ã³ã¢ãããäºæ³ãããã¯ããã«é ãã¦ç¾ããããã¾ã£ããç¾ããªãã£ããããå¯è½æ§ãããããã§ããå¤åã®åå ã¨ãã¦ã¯ã次ã®ãããªãã®ãæãããã¾ãã
- ãã¨ãã°ãä¸ä»£å¥ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å½±é¿ãªã©ã«ããããããªãã¸ã§ã¯ãã¨å¥ã®ãªãã¸ã§ã¯ããåæã«å°éã§ããªãç¶æ ã«ãªã£ãã¨ãã¦ãã䏿¹ã®ãªãã¸ã§ã¯ãã®æ¹ã仿¹ãããã¯ããã«æ©ãã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã¨ãªãå ´åãããã¾ãã
- ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¦çã¯ãå¢åæ¹å¼ã並è¡å¦çã¨ãã£ãææ³ãç¨ãã¦ãæéçµéã«ä¼´ãåå²ãè¡ãããå¯è½æ§ãããã¾ãã
- ã¡ã¢ãªã¼ä½¿ç¨éã¨ã¬ã¹ãã³ã¹ã®ãã©ã³ã¹ãã¨ãããã«ããã¾ãã¾ãªå®è¡æã®æ¢æ»çææ³ã使ç¨ãããå¯è½æ§ãããã¾ãã
- JavaScript ã¨ã³ã¸ã³ã¯ãä¸è¦ããã¨å°éã§ããªããã®ï¼ãã¨ãã°ãã¯ãã¼ã¸ã£ãã¤ã³ã©ã¤ã³ãã£ãã·ã¥å ãªã©ï¼ãåç §ãã¦ããå ´åãããã¾ãã
- JavaScript ã¨ã³ã¸ã³ã«ãã£ã¦ããããã®ãã¨ãããã®ãæé©ãªæ¹æ³ã¯ç°ãªãå ´åãããã¾ããã¾ããåãã¨ã³ã¸ã³ã§ãã£ã¦ãããã¼ã¸ã§ã³ã«ãã£ã¦ã¢ã«ã´ãªãºã ã夿´ããããã¨ãããã¾ãã
- ç¹å®ã® API ã使ç¨ãããªã©ãè¤éãªè¦å ã«ããããªãã¸ã§ã¯ããäºæãã¬ã»ã©é·ãæéåç¶ãç¶ãããã¨ãããã¾ãã
ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã®æ³¨æ
- éçºè ã¯ãããã°ã©ã ã®éè¦ãªãã¸ãã¯ãã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã«ä¾åãã¹ãã§ã¯ããã¾ãããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã¯ãããã°ã©ã ã®å®è¡ä¸ã«ã¡ã¢ãªã¼ä½¿ç¨éã縮å°ããä¸ã§ã¯æçããããã¾ãããããã以å¤ã®ç®çã§ã¯ã»ã¨ãã©å½¹ã«ç«ããªãã§ãããã
- ã³ã¼ãã§ã¬ã¸ã¹ããªã¼ã«å¤ãç»é²ããã°ããã®å ´åããã®ã¿ã¼ã²ããã¯ãç¾å¨ã® JavaScript ã¸ã§ã ãçµäºããã¾ã§è§£æ¾ããã¾ããã詳細ã«ã¤ãã¦ã¯ãWeakRef ã«é¢ããæ³¨æäºé ãåç §ãã¦ãã ããã
- 仿§ã«æºæ ãã JavaScript ã®å®è£ ã§ãã£ã¦ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãè¡ããã®ã§ãã£ã¦ããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå¼ã³åºãå¿ è¦ã¯ããã¾ãããããããã¤ããããã¯å¼ã³åºããã©ããã¯ãå®å ¨ã« JavaScript ã¨ã³ã¸ã³ã®å®è£ 次第ã§ããç»é²ããããªãã¸ã§ã¯ããååãããéããã®ãªãã¸ã§ã¯ãã«å¯¾ããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ã¯ããã®æç¹ã§å¼ã³åºããããã¨ãããã°ããã°ãããã¦ããå¼ã³åºããããã¨ãããã°ãã¾ã£ããå¼ã³åºãããªããã¨ãããã¾ãã
- 主è¦ãªå®è£ ã§ã¯ãå®è¡ä¸ã®ã©ããã®æç¹ã§ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå¼ã³åºãããå¯è½æ§ãé«ãã§ããããããã®å¼ã³åºãã¯ãé¢é£ãããªãã¸ã§ã¯ããè§£æ¾ãããå¾ãããªãæéãçµã£ã¦ããè¡ãããå¯è½æ§ãããã¾ããããã«ããããªãã¸ã§ã¯ãã 2 ã¤ã®ã¬ã¸ã¹ããªã¼ã«ç»é²ããã¦ããå ´åã2 ã¤ã®ã³ã¼ã«ããã¯ãé£ç¶ãã¦å¼ã³åºãããä¿è¨¼ã¯ããã¾ããã䏿¹ã®ã³ã¼ã«ããã¯ã¯å¼ã³åºããã¦ãããã䏿¹ã¯å¼ã³åºãããªãå ´åãããã䏿¹ãããªãå¾ã«ãªã£ã¦ããå¼ã³åºãããå ´åãããã¾ãã
- åæã«ãé常ã¯ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå¼ã³åºãå®è£
ã§ãã£ã¦ãããããå¼ã³åºããªãå¯è½æ§ãé«ãç¶æ³ãããã¾ãã
- JavaScript ããã°ã©ã ãå®å ¨ã«çµäºããã¨ãï¼ãã¨ãã°ããã©ã¦ã¶ã¼ã®ã¿ããéããããã¨ããªã©ï¼ã
FinalizationRegistryã¤ã³ã¹ã¿ã³ã¹èªä½ããJavaScript ã³ã¼ãããåç §ã§ããªããªããªã£ãã¨ãã
WeakRefã®ã¿ã¼ã²ãããFinalizationRegistryã«ãå«ã¾ãã¦ããå ´åããã®WeakRefã®ã¿ã¼ã²ããã¯ãã¬ã¸ã¹ããªã¼ã«é¢é£ä»ããããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå¼ã³åºãããã®ã¨åæã«ããããã¯ãã以åã«ã¯ãªã¢ããã¾ããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯å ã§ããã®ãªãã¸ã§ã¯ãã«å¯¾ããWeakRefã®derefãå¼ã³åºããå ´åãundefinedãè¿ããã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼
FinalizationRegistry()-
æ°ãã
FinalizationRegistryãªãã¸ã§ã¯ããçæãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
ãããã®ããããã£ã¯ FinalizationRegistry.prototype ã§å®ç¾©ããã¦ããããã¹ã¦ã® FinalizationRegistry ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãã
FinalizationRegistry.prototype.constructor-
ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã§ãã
FinalizationRegistryã¤ã³ã¹ã¿ã³ã¹ã®å ´åãåæå¤ã¯FinalizationRegistryã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã FinalizationRegistry.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]ããããã£ã®åæå¤ã¯ãæåå"FinalizationRegistry"ã§ãããã®ããããã£ã¯Object.prototype.toString()ã§ä½¿ç¨ããã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
FinalizationRegistry.prototype.register()-
ãªãã¸ã§ã¯ããã¬ã¸ã¹ããªã¼ã«ç»é²ãã¦ããªãã¸ã§ã¯ããã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ãããã¨ãã«ã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå®è¡ã§ããããã«ãã¾ãã
FinalizationRegistry.prototype.unregister()-
ãªãã¸ã§ã¯ããã¬ã¸ã¹ããªã¼ããç»é²è§£é¤ãã¾ãã
ä¾
>æ°ããã¬ã¸ã¹ããªã¼ã®çæ
ã³ã¼ã«ããã¯ã渡ããã¨ã§ã¬ã¸ã¹ããªã¼ã使ãããã¨ãã§ãã¾ãã
const registry = new FinalizationRegistry((heldValue) => {
// â¦
});
ã¯ãªã¼ã³ã¢ããã®ããã«ãªãã¸ã§ã¯ããç»é²
ãããããã¯ãªã¼ã³ã¢ããã³ã¼ã«ããã¯ãå¼ã³åºãä»»æã®ãªãã¸ã§ã¯ããç»é²ããã«ã¯ã register ã¡ã½ãããå¼ã³åºãã¦ããã®ãªãã¸ã§ã¯ãã¨ä¿æå¤ã渡ãã¾ãã
registry.register(theObject, "some value");
ã³ã¼ã«ããã¯ã¯åæçã«å¼ã³åºãããªã
ã¬ãã¼ã¸ã³ã¬ã¯ã¿ã¼ã«ã©ãã»ã©è² è·ããããã¨ãã¦ããã¯ãªã¼ã³ã¢ããã®ã³ã¼ã«ããã¯ãåæçã«å¼ã³åºããããã¨ã¯æ±ºãã¦ããã¾ããããªãã¸ã§ã¯ãã¯åæçã«è§£æ¾ãããå ´åãããã¾ãããã³ã¼ã«ããã¯ã¯å¸¸ã«ç¾å¨ã®ã¸ã§ããå®äºããå¾ã«å¼ã³åºããã¾ãã
let counter = 0;
const registry = new FinalizationRegistry(() => {
console.log(`Array 㯠${counter} ã§ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ããã¾ãã`);
});
registry.register(["foo"]);
(function allocateMemory() {
// 50000 ä»¶ã®é¢æ°ãå²ãå½ã¦ã¾ãã â ã¡ã¢ãªã¼ãããããæ¶è²»ãã¾ãã
Array.from({ length: 50000 }, () => () => {});
if (counter > 5000) return;
counter++;
allocateMemory();
})();
console.log("ã¡ã¤ã³ã¸ã§ãçµäº");
// Logs:
// ã¡ã¤ã³ã¸ã§ãçµäº
// Array 㯠5001 ã§ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ããã¾ãã
ãã ããããããã®å²ãå½ã¦ã®éã«å°ãééã空ãããã¨ãã§ããã¨ãã³ã¼ã«ããã¯ãããæ©ãå¼ã³åºããããã¨ãããã¾ãã
let arrayCollected = false;
let counter = 0;
const registry = new FinalizationRegistry(() => {
console.log(`Array 㯠${counter} ã§ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ããã¾ãã`);
arrayCollected = true;
});
registry.register(["foo"]);
(function allocateMemory() {
// 50000 ä»¶ã®é¢æ°ãå²ãå½ã¦ã¾ãã â ã¡ã¢ãªã¼ãããããæ¶è²»ãã¾ãã
Array.from({ length: 50000 }, () => () => {});
if (counter > 5000 || arrayCollected) return;
counter++;
// setTimeout ã使ç¨ãããã¨ã§ãããããã® allocateMemory ãå¥ã
ã®ã¸ã§ãã¨ãã¦å®è¡
setTimeout(allocateMemory);
})();
console.log("ã¡ã¤ã³ã¸ã§ãçµäº");
ã³ã¼ã«ããã¯ãããããæ©ãå¼ã³åºããããã¨ããããããå¼ã³åºããããã¨èªä½ãä¿è¨¼ãããã®ã§ã¯ããã¾ãããããã°åºåãããã¡ãã»ã¼ã¸ã®ã«ã¦ã³ã¿ã¼å¤ã 5000 æªæºã§ããå¯è½æ§ã¯ããã¾ãã
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-finalization-registry-objects > |