Baseline Widely available *
WeakRef
对象å
è®¸ä½ ä¿ç对å¦ä¸ä¸ªå¯¹è±¡çå¼±å¼ç¨ï¼ä½ä¸ä¼é»æ¢åå¾åæ¶ï¼GCï¼æ¸
ç被弱å¼ç¨ç对象ã
WeakRef
对象å
å«å¯¹å¯¹è±¡çå¼±å¼ç¨ï¼è¿ä¸ªå¼±å¼ç¨è¢«ç§°ä¸ºè¯¥ WeakRef 对象ç target æè
æ¯ referentã对象çå¼±å¼ç¨æ¯æè¯¥å¼ç¨ä¸ä¼é»æ¢ GC åæ¶è¿ä¸ªå¯¹è±¡ãè䏿¤ç¸åçï¼ä¸ä¸ªæ®éçå¼ç¨ï¼æè
说强å¼ç¨ï¼ä¼å°ä¸ä¹å¯¹åºç对象ä¿åå¨å
åä¸ãåªæå½è¯¥å¯¹è±¡æ²¡æä»»ä½ç强å¼ç¨æ¶ï¼JavaScript 弿 GC æä¼éæ¯è¯¥å¯¹è±¡å¹¶ä¸åæ¶è¯¥å¯¹è±¡æå çå
å空é´ã妿ä¸è¿°æ
åµåçäºï¼é£ä¹ä½ å°±æ æ³éè¿ä»»ä½çå¼±å¼ç¨æ¥è·å该对象ã
夿³¨ï¼ å¨ä½¿ç¨å请é 读尽éé¿å 使ç¨ï¼å¯¹äº WeakRef 对象ç使ç¨è¦æ éèèï¼è½ä¸ä½¿ç¨å°±å°½éä¸è¦ä½¿ç¨
æé 彿°WeakRef()
å建ä¸ä¸ª WeakRef 对象
WeakRef.prototype.deref()
è¿åå½åå®ä¾ç WeakRef 对象æç»å®ç target 对象ï¼å¦æè¯¥ target 对象已被 GC åæ¶åè¿åundefined
æ£ç¡®ä½¿ç¨ WeakRef 对象éè¦ä»ç»çèèï¼æå¥½å°½éé¿å 使ç¨ãé¿å ä¾èµäºè§è没æä¿è¯çä»»ä½ç¹å®è¡ä¸ºä¹æ¯ååéè¦çã使¶ãå¦ä½ä»¥åæ¯å¦åçåå¾åæ¶åå³äºä»»ä½ç»å® JavaScript 弿çå®ç°ãGC å¨ä¸ä¸ª JavaScript 弿ä¸çè¡ä¸ºæå¯è½å¨å¦ä¸ä¸ª JavaScript 弿ä¸çè¡ä¸ºå¤§ç¸å¾åºï¼æè çè³å¨åä¸ç±»å¼æï¼ä¸åçæ¬ä¸ GC çè¡ä¸ºé½æå¯è½æè¾å¤§çå·®è·ãGC ç®åè¿æ¯ JavaScript 弿å®ç°è 䏿æ¹è¿åæ¹è¿è§£å³æ¹æ¡çä¸ä¸ªé¾é¢ã
以䏿¯ WeakRef ææ¡çä½è å¨å ¶è§£éæä»¶ï¼explainer documentï¼ä¸æåºçä¸äºå ·ä½è§ç¹
å ³äº WeakRef ç说æåå¾åæ¶æ¯å¤æçã妿æä¸ªåºç¨æè åºä¾èµäº GC åæ¶ãå¯é¢æµå°æ¸ ç WeakRef æè è°ç¨ç»ç»å¨ç[æ¸ çåè°]ãé£ä¹å®å¾å¯è½è®©äººå¤±æï¼æ¸ çå·¥ä½å¯è½æ¯é¢ææå¾å¤ï¼çè³æ ¹æ¬æ²¡æãå·®å¼çæ¥æºå æ¬ï¼
- ç±äºå代æ¶éçåå ï¼å³ä½¿ä¸¤ä¸ªå¯¹è±¡åæ¶åå¾ä¸å¯è¾¾ï¼å ¶ä¸ä¸ä¸ªå¯¹è±¡ä¹å¯è½æ¯å¦ä¸ä¸ªå¯¹è±¡æ©å¾å¤è¢«åå¾åæ¶ã
- åå¾åæ¶å·¥ä½å¯ä»¥éè¿å¢éåå¹¶åææ¯å¨ä¸æ®µæ¶é´å 忣è¿è¡ã
- 弿ä¼ä½¿ç¨å¤ç§è¿è¡æ¶çç¥æ¥å¹³è¡¡å åå ç¨ä¸ååºé度ã
- JavaScript 弿å¯è½å¯¹çä¼¼ä¸å¯è¾¾ç对象ææå¼ç¨ï¼ä¾å¦ï¼å¨éå 䏿å èç¼åä¸ï¼ã
- ä¸åç JavaScript 弿坹è¿äºå¤çæ¹å¼å¯è½åå¨å·®å¼ï¼èä¸åä¸å¼æå¯è½éççæ¬æ¹åå ¶ç®æ³ã
- ä¸äºå¤æå ç´ æ¯å¦ä½¿ç¨ç¹å® API ä¹å¯è½å¯¼è´å¯¹è±¡çåæ´»æ¶é´è¶ åºé¢æã
WeakRef
s æç¸åçç®æ ï¼é£ä¹ä»ä»¬ç target 对象æ¯ä¸æ ·çã对å
¶ä¸ä¸ä¸ªè°ç¨ deref çç»æå°ä¸å¯¹å¦ä¸ä¸ªè°ç¨ deref çç»æå¹é
ï¼å¨åä¸ä¸ªä½ä¸ä¸ï¼ï¼ä½ ä¸ä¼ä»å
¶ä¸ä¸ä¸ªè·åç®æ 对象ï¼èæ¯ä»å¦ä¸ä¸ªè·åæªå®ä¹ç对象ãFinalizationRegistry
,é£ä¹è¯¥ target å°±ä¼å¨è°ç¨ä¸æ³¨å表å
³èç任使¸
çåè°ä¹åæè
åæ¶è¢«æ¸
çã妿æ¸
çåè°è°ç¨å¯¹è±¡ç WeakRef ä¸ç derefï¼å®å°æ¶å°undefined
è¿ä¸ªä¾åæ¼ç¤ºäºå¨ä¸ä¸ª DOM å ç´ ä¸å¯å¨ä¸ä¸ªè®¡æ°å¨ï¼å½è¿ä¸ªå ç´ ä¸å卿¶åæ¢ï¼
class Counter {
constructor(element) {
// Remember a weak reference to the DOM element
this.ref = new WeakRef(element);
this.start();
}
start() {
if (this.timer) {
return;
}
this.count = 0;
const tick = () => {
// Get the element from the weak reference, if it still exists
const element = this.ref.deref();
if (element) {
element.textContent = ++this.count;
} else {
// The element doesn't exist anymore
console.log("The element is gone.");
this.stop();
this.ref = null;
}
};
tick();
this.timer = setInterval(tick, 1000);
}
stop() {
if (this.timer) {
clearInterval(this.timer);
this.timer = 0;
}
}
}
const counter = new Counter(document.getElementById("counter"));
counter.start();
setTimeout(() => {
document.getElementById("counter").remove();
}, 5000);
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4