C ì¸ì´ê°ì ì ìì¤ ì¸ì´ììë, ë©ëª¨ë¦¬ ê´ë¦¬ë¥¼ ìí´ malloc()
ê³¼ free()
를 ì¬ì©í©ëë¤. ë°ë©´, JavaScriptë ê°ì²´ê° ìì±ëìì ë ìëì¼ë¡ ë©ëª¨ë¦¬ë¥¼ í ë¹íê³ ë ì´ì íìíì§ ìì ë ìëì¼ë¡ í´ì í©ëë¤(ê°ë¹ì§ 컬ë ì
). ì´ë¬í ìë ë©ëª¨ë¦¬ ê´ë¦¬ë ì ì¬ì í¼ëì ìì¸ì´ê¸°ë íë°, ê°ë°ìê° ë©ëª¨ë¦¬ ê´ë¦¬ì ëí´ ê³ ë¯¼í íìê° ìë¤ë ì못ë ì¸ìì ì¬ì´ì¤ ì ì기 ë문ì
ëë¤.
ë©ëª¨ë¦¬ ì존주기ë ëë¶ë¶ì íë¡ê·¸ëë° ì¸ì´ìì ë¹ì·í©ëë¤.
ë ë²ì§¸ ë¶ë¶ì 모ë ì¸ì´ìì ëª ìì ì¼ë¡ ì¬ì©ë©ëë¤. ê·¸ë¬ë 첫 ë²ì§¸ ë¶ë¶ê³¼ ë§ì§ë§ ë¶ë¶ì ì ìì¤ ì¸ì´ììë ëª ìì ì´ë©°, JavaScriptì ê°ì ëë¶ë¶ì ê³ ìì¤ ì¸ì´ììë ì묵ì ì¼ë¡ ìëí©ëë¤.
JavaScriptì ë©ëª¨ë¦¬ í ë¹ ê° ì´ê¸°ííë¡ê·¸ëë¨¸ê° ë©ëª¨ë¦¬ í ë¹ì ì ê²½ì ì¸ íìê° ìëë¡, JavaScriptë ê°ì ì ì¸í ë ìëì¼ë¡ ë©ëª¨ë¦¬ë¥¼ í ë¹í©ëë¤.
const n = 123; // ì ì를 ë´ê¸° ìí ë©ëª¨ë¦¬ í ë¹
const s = "azerty"; // 문ìì´ì ë´ê¸° ìí ë©ëª¨ë¦¬ í ë¹
const o = {
a: 1,
b: null,
}; // ì¤ë¸ì í¸ì ê·¸ ì¤ë¸ì í¸ì í¬í¨ë ê°ë¤ì ë´ê¸° ìí ë©ëª¨ë¦¬ í ë¹
// (ì¤ë¸ì í¸ì²ë¼) ë°°ì´ê³¼ ë°°ì´ì ë´ê¸´ ê°ë¤ì ìí ë©ëª¨ë¦¬ í ë¹
const a = [1, null, "abra"];
function f(a) {
return a + 2;
} // í¨ì를 ìí í ë¹(í¨ìë í¸ì¶ ê°ë¥í ì¤ë¸ì í¸)
// í¨ìì ëí ì¤ë¸ì í¸ë¥¼ ë´ê¸° ìí ë©ëª¨ë¦¬ë¥¼ í ë¹í©ëë¤.
someElement.addEventListener(
"click",
() => {
someElement.style.backgroundColor = "blue";
},
false,
);
í¨ì í¸ì¶ì íµí í ë¹
í¨ì í¸ì¶ì ê²°ê³¼ ë©ëª¨ë¦¬ í ë¹ì´ ì¼ì´ë기ë í©ëë¤.
const d = new Date(); // Date ê°ì²´ë¥¼ ìí´ ë©ëª¨ë¦¬ë¥¼ í ë¹
const e = document.createElement("div"); // DOM ì리먼í¸ë¥¼ ìí´ ë©ëª¨ë¦¬ë¥¼ í ë¹
ë©ìëê° ìë¡ì´ ê°ì´ë ì¤ë¸ì í¸ë¥¼ í ë¹í기ë í©ëë¤.
const s = "azerty";
const s2 = s.substr(0, 3); // s2ë ìë¡ì´ 문ìì´
// JavaScriptìì 문ìì´ì immutable ê°ì´ê¸° ë문ì,
// ë©ëª¨ë¦¬ë¥¼ ìë¡ í ë¹íì§ ìê³ ë¨ìí [0, 3] ì´ë¼ë ë²ìë§ ì ì¥í©ëë¤.
const a = ["ouais ouais", "nan nan"];
const a2 = ["generation", "nan nan"];
const a3 = a.concat(a2);
// a ì a2 를 ì´ì´ë¶ì¬, 4ê°ì ìì를 ê°ì§ ìë¡ì´ ë°°ì´
ê° ì¬ì©
ê° ì¬ì©ì´ë 기본ì ì¼ë¡ë í ë¹ë ë©ëª¨ë¦¬ë¥¼ ì½ê³ ì°ë ê²ì ì미í©ëë¤. ë³ìë ê°ì²´ ìì±ì ê°ì ì½ê³ ì°ê±°ë í¨ì í¸ì¶ ì í¨ìì ì¸ì를 ì ë¬íì¬ ìíí ì ììµëë¤.
í ë¹ë ë©ëª¨ë¦¬ê° ë ì´ì íììì ë í´ì íê¸°ì´ ë¨ê³ìì ëë¶ë¶ì ë©ëª¨ë¦¬ ê´ë¦¬ 문ì ê° ë°ìí©ëë¤. "í ë¹ë ë©ëª¨ë¦¬ê° ë ì´ì íììì ë"를 ììë´ê¸°ê° ê°ì¥ ì´ë µê¸° ë문ì ëë¤.
ì ìì¤ ì¸ì´ììë ë©ëª¨ë¦¬ê° íììì´ì§ ë를 ê°ë°ìê° ì§ì ê²°ì íê³ í´ì íë ë°©ìì ì¬ì©í©ëë¤.
JavaScriptì ê°ì ê³ ìì¤ ì¸ì´ë¤ì "ê°ë¹ì§ ì½ë ì (GC)"ì´ë¼ë ìë ë©ëª¨ë¦¬ ê´ë¦¬ ë°©ë²ì ì¬ì©í©ëë¤. ê°ë¹ì§ ì½ë í°ì 목ì ì ë©ëª¨ë¦¬ í ë¹ì ì¶ì íê³ í ë¹ë ë©ëª¨ë¦¬ ë¸ë¡ì´ ë ì´ì íìíì§ ìê² ëìëì§ë¥¼ íë¨íì¬ íìíë ê²ì ëë¤. ì´ë¬í ìë ë©ëª¨ë¦¬ ê´ë¦¬ íë¡ì¸ì¤ê° ê¶ê·¹ì ë°©ë²ì ìëëë¤. ìëíë©´ ì´ë¤ ë©ëª¨ë¦¬ê° ì¬ì í íìíì§ ìëì§ë¥¼ íë¨íë ê²ì ë¹ê²°ì ì 문ì ì´ê¸° ë문ì ëë¤.
ê°ë¹ì§ ì½ë ì ììì ì¸ê¸í ê²ì²ë¼ "ë ì´ì íìíì§ ìì" 모ë ë©ëª¨ë¦¬ë¥¼ ì°¾ëê±´ ë¹ê²°ì ì 문ì ì ëë¤. ë°ë¼ì ê°ë¹ì§ 컬ë í°ë¤ì ì´ ë¬¸ì ì ëí ì íì ì¸ í´ê²°ì± ì 구íí©ëë¤. ì´ ì¹ì ììë 주ìí ê°ë¹ì§ 컬ë ì ìê³ ë¦¬ì¦ë¤ê³¼ ê·¸ íê³ë¥¼ ì´í´íëë° íìí ê°ë ì ì¤ëª í©ëë¤.
참조ê°ë¹ì§ ì½ë ì ìê³ ë¦¬ì¦ì íµì¬ ê°ë ì 참조ì ëë¤. ë©ëª¨ë¦¬ ê´ë¦¬ ë§¥ë½ìì, Aë¼ë ë©ëª¨ë¦¬ë¥¼ íµí´ (ëª ìì ì´ë ììì ì´ë ) Bë¼ë ë©ëª¨ë¦¬ì ì ê·¼í ì ìë¤ë©´ "Bë Aì 참조ëë¤" ë¼ê³ í©ëë¤. ì를 ë¤ì´, 모ë JavaScript ì¤ë¸ì í¸ë prototype (implicit reference) (ììì 참조) ë° ê·¸ ê°ì²´ì ìì±ì ëí 참조 (ëª ìì 참조)ê° ììµëë¤.
ì´ ë§¥ë½ìì "ê°ì²´"ì ê°ë ì ì¼ë° JavaScript ê°ì²´ì í¨ì ë²ì(ëë ì ì ì´í ë²ì)를 í¬í¨íì¬ ë ëê² íì¥ë©ëë¤.
참조-ì¸ê¸°(Reference-counting) ê°ë¹ì§ ì½ë ì ì°¸ê³ : ìµì ë¸ë¼ì°ì ë ë ì´ì 참조-ì¸ê¸° ê°ë¹ì§ ì½ë ì ë°©ìì ì¬ì©íì§ ììµëë¤.
참조-ì¸ê¸° ìê³ ë¦¬ì¦ì ê°ì¥ ë¨ìíê² êµ¬íë ìê³ ë¦¬ì¦ì ëë¤. ì´ ìê³ ë¦¬ì¦ì 'ì´ë¤ ë¤ë¥¸ ê°ì²´ë 참조íì§ ìë ê°ì²´'를 'ë ì´ì íì ìë ê°ì²´'ë¼ê³ ì¬ê¹ëë¤. ì´ ê°ì²´ë¥¼ "ê°ë¹ì§"ë¼ ë¶ë¥´ë©°, ì´ë¥¼ 참조íë ë¤ë¥¸ ê°ì²´ê° íëë ìë ê²½ì°, ìì§ì´ ê°ë¥í©ëë¤.
ìì :
let x = {
a: {
b: 2,
},
};
// 2ê°ì ê°ì²´ê° ìì±ëììµëë¤. íëì ê°ì²´ë ë¤ë¥¸ ê°ì²´ì ìì±ì¼ë¡ 참조ë©ëë¤.
// ëë¨¸ì§ íëë 'x' ë³ìì í ë¹ëì´ ì°¸ì¡°ë©ëë¤.
// ëª
ë°±íê², ê°ë¹ì§ ì½ë ì
ìíë ë©ëª¨ë¦¬ë íëë ììµëë¤.
let y = x;
// 'y' ë³ìë ìì ê°ì²´ë¥¼ 참조íë ë ë²ì§¸ ë³ìì
ëë¤.
x = 1;
// ì´ì 'y' ë³ìê° ìì ê°ì²´ë¥¼ 참조íë ì ì¼í ë³ìê° ëììµëë¤.
let z = y.a;
// ìì ê°ì²´ì 'a' ìì±ì 참조íìµëë¤.
// ì´ì ì´ ê°ì²´ë ë ê°ì 참조를 ê°ì§ëë¤.
// 'y'ê° ìì±ì¼ë¡ 참조íê³ 'z'ë¼ë ë³ìê° ì°¸ì¡°í©ëë¤.
y = "mozilla";
// ì´ì 맨 ì²ì 'x' ë³ìê° ì°¸ì¡°íë ê°ì²´ì ëí ì°¸ì¡°ê° ì기 ë문ì, ê°ë¹ì§ 컬ë ì
ì´ ê°ë¥í©ëë¤.
// ê·¸ë¬ë, ê°ì²´ì 'a' ìì±ì´ ì¬ì í 'z' ë³ìì ìí´ ì°¸ì¡°ëë¯ë¡
// ë©ëª¨ë¦¬ë¥¼ í´ì í ì ììµëë¤.
z = null;
// ì´ì 맨 ì²ì 'x' ë³ìê° ì°¸ì¡°íë ê°ì²´ì 'a' ìì±ìë
// ì°¸ì¡°ê° ìì¼ë¯ë¡ ê°ë¹ì§ ì½ë ì
ì´ ìíë ì ììµëë¤.
ìí 참조를 ë¤ë£¨ë ì¼ìë íê³ê° ììµëë¤. ë¤ì ìì ììë, ë ê°ì²´ê° ìë¡ ì°¸ì¡°íë ìì±ì¼ë¡ ìì±ëì´ ìí 구조를 ìì±í©ëë¤. í¨ì í¸ì¶ì´ ìë£ëë©´ ì´ ë ê°ì²´ë ì¤ì½í를 ë²ì´ëê² ë ê²ì´ë©°, ê·¸ ìì ìì ë ê°ì²´ë ë¶íìí´ì§ë¯ë¡ í ë¹ë ë©ëª¨ë¦¬ë íìëì´ì¼ í©ëë¤. ê·¸ë¬ë ë ê°ì²´ê° ìë¡ë¥¼ 참조íê³ ìì¼ë¯ë¡, 참조-ì¸ê¸° ìê³ ë¦¬ì¦ì ë ë¤ ê°ë¹ì§ 컬ë ì ì ëìì¼ë¡ íìíì§ ììµëë¤. ì´ë¬í ìí 참조ë ë©ëª¨ë¦¬ ëìì íí ìì¸ì ëë¤.
function f() {
const x = {};
const y = {};
x.a = y; // xë y를 참조í©ëë¤.
y.a = x; // yë x를 참조í©ëë¤.
return "azerty";
}
f();
íìíê³ -ì¸ê¸°(Mark-and-sweep) ìê³ ë¦¬ì¦
ì´ ìê³ ë¦¬ì¦ì "ë ì´ì íììë ê°ì²´"를 "ëë¬í ì ìë ê°ì²´"ë¡ ì ìí©ëë¤.
ì´ ìê³ ë¦¬ì¦ì "roots" ë¼ë ê°ì²´ì ì§í©ì ê°ì§ê³ ììµëë¤. JavaScriptìì rootë ì ì ê°ì²´ì ëë¤. 주기ì ì¼ë¡, ê°ë¹ì§ ì½ë í°ë rootsë¡ ë¶í° ììíì¬ rootsê° ì°¸ì¡°íë ê°ì²´ë¤, rootsê° ì°¸ì¡°íë ê°ì²´ê° 참조íë ê°ì²´ë¤ ë±ì ì°¾ìµëë¤. rootsë¡ ë¶í° ììíì¬ ê°ë¹ì§ ì½ë í°ë 모ë ëë¬í ì ìë ê°ì²´ë¤ì ì°¾ê³ , ëë¬í ì ìë 모ë ê°ì²´ë¤ì ìì§í©ëë¤.
ì´ ìê³ ë¦¬ì¦ì ìì 참조-ì¸ê¸° ë°©ìë³´ë¤ ê°ì ë ííë¼ê³ í ì ìëë°, ê·¸ ì´ì ë ì°¸ì¡°ê° ìë ê°ì²´ë ëª íí ëë¬í ì ì기 ë문ì ëë¤. ìí 참조ìì 본 ê²ì²ë¼, ê·¸ ë°ë(ëª íí ëë¬í ì ìë¤ë©´, ì°¸ì¡°ê° ìë¤)ë ì¬ì¤ì´ ìëëë¤.
íì¬ ëª¨ë ìµì ìì§ì íìíê³ -ì¸ê¸° ê°ë¹ì§ ìì§ì ì ê³µí©ëë¤. JavaScript ê°ë¹ì§ ìì§ íë(ì¸ëë³/ì¦ë¶ì /ëìì /ë³ë ¬ì ê°ë¹ì§ ìì§)ìì ì§ë ëª ë ê°ì 모ë ê°ì ë¤ì ì´ ìê³ ë¦¬ì¦ì 구íì íµí ê°ì ì´ë©°, ê°ë¹ì§ ìì§ ìê³ ë¦¬ì¦ì´ë ì¸ì "ê°ì²´ê° íì ìëì§"ì ëí ì ì를 ë°ìíë ë¶ë¶ì ìì´ìì ê°ì ì ìëëë¤.
ì´ë¬í ì 근방ìì ì§ì ì ì¸ í¨ì©ì ë ì´ì ì£¼ê¸°ê° ë¬¸ì ê° ëì§ ìëë¤ë ì ì ëë¤. ìì 첫 ìììì, í¨ì í¸ì¶ì´ 리í´ëê³ ëì ë ê°ì ê°ì²´ë¤ì ë ì´ì ì ì ê°ì²´ìì 참조íê³ ìë ì´ë¤ 리ìì¤ììë 참조íì§ ììµëë¤. ê²°ê³¼ì ì¼ë¡, ë ê°ì²´ë¤ì ê°ë¹ì§ ìì§ê¸°ê° ëë¬í ì ìë ê²ì¼ë¡ íëª ëê³ í ë¹ëìë ë©ëª¨ë¦¬ë¥¼ íìíê² ë©ëë¤.
ê·¸ë¬ë, ê°ë¹ì§ ìì§ì ìëì¼ë¡ ì¡°ìí ì ìë¤ë 문ì ê° ë¨ìµëë¤. ì´ë¤ ê²½ì°ììë ìëì¼ë¡ ì¸ì , ì´ë¤ ë©ëª¨ë¦¬ë¥¼ ë°íí ì§ ê²°ì íë ê²ì´ í¸ë¦¬í ëê° ììµëë¤. ê°ì²´ì ë©ëª¨ë¦¬ë¥¼ ë°íí기 ìí´ì, í´ë¹ ê°ì²´ë ëª ìì ì¼ë¡ ëë¬í ì ìê² ëì´ì¼ í©ëë¤. ëí JavaScriptìì íë¡ê·¸ëë°ì ì¼ë¡ ê°ë¹ì§ ìì§ì ììíë ê²ì ë¶ê°ë¥íë©°, ë¹ë¡ ìì§ì íë그를 íµí´ì API를 ì ê³µí ì§ ëª°ë¼ë, ì½ì´ ì¸ì´ë¨ììë ì¶íìë ì§ìíì§ ìì ê²ì ëë¤.
ìì§ì ë©ëª¨ë¦¬ 모ë¸(memory model) ì¤ì í기JavaScript ìì§ì ì£¼ë¡ ë©ëª¨ë¦¬ 모ë¸ì ë ¸ì¶íë íë그를 ì ê³µí©ëë¤. ìë¡, Node.jsë ì¤ì ê³¼ ë©ëª¨ë¦¬ 문ì ëë²ê¹ ì ìí´ ë´ë¶ë¥¼ 구ì±íë V8 ë©ì»¤ëì¦ì ë ¸ì¶íë ì¶ê°ì ì¸ ìµì ê³¼ ë구를 ì ê³µí©ëë¤. ì´ ì¤ì ì ë¸ë¼ì°ì ììë ëë¶ë¶ì ë¶ê°ë¥íê³ , ì¹ íì´ì§(HTTP í¤ë ë±ì íµí´) ìììë ëëì± ë¶ê°ë¥í©ëë¤.
ê°ì©í í ë©ëª¨ë¦¬ì ìµëëì ìëì ê°ì íë그를 íµí´ ì¬ë¦´ ì ììµëë¤:
node --max-old-space-size=6000 index.js
ëí íëê·¸ë Chrome Debugger를 ì¬ì©í´ ë©ëª¨ë¦¬ 문ì 를 ëë²ê¹ í기 ìí ê°ë¹ì§ 컬ë í° ì 보를 ë³´ì¬ì¤ ì ììµëë¤:
node --expose-gc --inspect index.js
ë©ëª¨ë¦¬ ê´ë¦¬ë¥¼ ëë ë°ì´í° 구조
ë¹ë¡ JavaScriptê° ê°ë¹ì§ ìì§ê¸° API를 ì§ì ì ì¼ë¡ ë ¸ì¶íì§ë ìëë¼ë, JavaScriptë ê°ì ì ì¼ë¡ ê°ë¹ì§ ìì§ì ê´ì°°íë©° ë©ëª¨ë¦¬ ê´ë¦¬ì ì¸ ì ìë ëª ê°ì§ ë°ì´í° 구조를 ì ê³µí©ëë¤.
WeakMapsê³¼ WeakSetsWeakMap
ê³¼ WeakSet
ì ê° non-weakì ëìëë Map
ê³¼ Set
ì API를 모방í ë°ì´í° 구조ì
ëë¤. WeakMap
ì í¤-ê° ìì 모ìì ì ê³µíë ë°ë©´, WeakSet
ì ì ì¼í ê°ë¤ë¡ ì´ë¤ì§ 모ìì ì ê³µí©ëë¤. ê°ê°ì ì¶ê°, ìì , ì¡°í 기ë¥ì ì ê³µí©ëë¤.
WeakMap
ê³¼ WeakSet
ì ì´ë¦ì "weakly held" ê°ì´ë¼ë ê°ë
ìì ë°ììµëë¤. ë§ì½ x
ê° y
ì ìí´ "weekly held"ëìë¤ë¼ë ì미ë, ë¹ë¡ y
를 íµí´ x
ì ê°ì ì ê·¼í ì ìì§ë§, íìíê³ -ì¸ê¸° ìê³ ë¦¬ì¦ì ë¤ë¥¸ ê²ì´ x
를 _strongly hold* íê³ ìì§ ìì ì´ì ëë¬í ì ìë ê²ì¼ë¡ ê°ì£¼íì§ ììµëë¤. ì¬ê¸°ì ë
¼ìëê³ ìë ê²ì ì ì¸í, ëë¶ë¶ì ë°ì´í° 구조ë ì ë¬ë ê°ì²´ë¥¼ strongly holdí기ì ê°ì²´ì ì¸ì ë ì ê·¼í ì ììµëë¤. WeakMap
ê³¼ WeakSet
ì í¤ë íë¡ê·¸ë¨ì ì´ë¤ ê²ë í¤ë¥¼ 참조íì§ ìëë¤ë©´ ê°ë¹ì§ ì½ë ì
ë ì ììµëë¤ (WeakMap
ìì ê°ì ê·¸ì´í ê°ë¹ì§ ì½ë ì
ë ì ìì). ì´ ë¶ë¶ì ìë ë ê°ì§ í¹ì±ì íµí´ ë³´ì¥ë©ëë¤:
WeakMap
ê³¼ WeakSet
ì ì¤ì§ ê°ì²´ ëë 기í¸ë§ ì ì¥í©ëë¤. ê·¸ ì´ì ë ì¤ì§ ê°ì²´ë¤ë§ì´ ê°ë¹ì§ ì½ë í¸ëê³ ììê°ë¤ì ë³µì¬ë기ì(1 === 1
ì´ë {} !== {}
ì´ê¸°ì), ììê°ë¤ì´ ì½ë ì
ì ììí ë¨ëë¡ í©ëë¤. Registered symbols (like Symbol.for("key")
) ëí ë³µì¬ë ì ìì¼ë¯ë¡, ê°ë¹ì§ ìì§ì´ ë¶ê°ë¥íì§ë§, Symbol("key")
ë¡ ìì±ë 기í¸ë ê°ë¹ì§ ìì§ì´ ê°ë¥í©ëë¤. Symbol.iterator
ì ê°ì Well-known symbolsì ê³ ì ë ì¸í¸ë¡ ì ê³µëë©° Array.prototype
ê³¼ ê°ì ê³ ì ê°ì²´ì ì ì¬íê² íë¡ê·¸ë¨ ìëª
ëì ê³ ì íë¯ë¡ í¤ë¡ë íì©ë©ëë¤.WeakMap
ê³¼ WeakSet
ì ìíí ì ììµëë¤. ì´ë ê² íë©´ Array.from(map.keys()).length
ì ì¬ì©í´ ê°ì²´ì ìí를 ê´ì°°íê±°ë ê°ë¹ì§ ìì§ ëìì´ ëì´ì¼íë ììì í¤ë¥¼ ê°ì§ê³ ìì´ì¼ íë ê²ì ë°©ì§í ì ììµëë¤(ê°ë¹ì§ ì½ë ì
ì ìµëí ìí¥ì ëë¼ì§ 못íëë¡ ìíëì´ì¼ í©ëë¤).ì£¼ë¡ WeakMap
ê³¼ WeakSet
ì ì¤ëª
í ë, ë³´íµ í¤ê° 먼ì ê°ë¹ì§ ìì§ëê³ ì´í ê° ëí ê°ë¹ì§ ìì§ëë¤ê³ ììí©ëë¤. ê·¸ë¬ë, ìëì ê°ì´ í¤ë¥¼ 참조íë ê°ì´ ìë ì¼ì´ì¤ë¥¼ ì´í´ë³´ê² ìµëë¤.
const wm = new WeakMap();
const key = {};
wm.set(key, { key });
// ê°ì´ í¤ë¥¼ 참조í기ì, `key`ë ê°ë¹ì§ ì½ë ì
ëìì´ ìëë©°
// ê·¸ ê°ì map ììì strongly holdëì´ ììµëë¤.
ë§ì½ key
ê° ì¤ì ì°¸ì¡°ë¡ ì ì¥ëë¤ë©´, ë¤ë¥¸ ê°ì´ key
를 참조íì§ ììë ìí 참조를 ë§ë¤ë©° í¤ì ê° ëª¨ë ê°ë¹ì§ ìì§ ëìì´ ìëëë¡ í©ëë¤. ê·¸ ì´ì ë ë§ì½ key
ê° ê°ë¹ì§ ìì§ëë©´, í¹ì ìì ì value.key
ë ì¡´ì¬íì§ ìë 주ì를 ê°ë¦¬í¤ë ë¶ì ì í ìí©ì´ ë ì ììµëë¤. ì´ ì ì ìì í기 ìí´, WeakMap
ê³¼ WeakSet
ì í목ë¤ì ì¤ì ì°¸ì¡°ê° ìëê³ íìíê³ -ì¸ê¸° ë©ì»¤ëì¦ì ë³´ê°ì ì¸ ephemeronsì
ëë¤. Barros et al.ì í´ë¹ ìê³ ë¦¬ì¦ì ëí íë¥í ìì½ë³¸ì ì ê³µí©ëë¤ (4 íì´ì§). í 문ë¨ì ì¸ì©í´ë³´ê² ìµëë¤.
Ephemeronsì í¤ì ê° ëª¨ë weak ëë strongì¼ë¡ ë¶ë¥ë ì ìë ì½í ì(weak pairs)ì ê°ì í ê²ì ëë¤. í¤ì ì°ê²°ì±ì ê°ì ì°ê²°ì±ì ê²°ì íë, ê°ì ì°ê²°ì±ì í¤ì ì°ê²°ì±ì ê²°ì ì§ì§ ììµëë¤. [â¦] ê°ë¹ì§ ì½ë ì ì´ ephemeronsì ì§ìí ë, ê°ë¹ì§ ì½ë ì ì íìí기 ë° ì¸ê¸°ì 2ë¨ê³ê° ìëë¼ 3ë¨ê³ì ê±¸ì³ ì§íë©ëë¤.
ëëµì ì¸ ë©í 모ë¸ë¡, WeakMap
ì ìëì ê°ì 구íì²´ë¡ ìê°í´ë³´ë©´:
ê²½ê³ : ìëë í´ë¦¬íë ìëê³ , ì¤ì ê°ë¹ì§ ì½ë ì ì ê´ê³íë ìì§ì 구íì²´ 구조ìë ê±°ë¦¬ê° ë©ëë¤.
class MyWeakMap {
#marker = Symbol("MyWeakMapData");
get(key) {
return key[this.#marker];
}
set(key, value) {
key[this.#marker] = value;
}
has(key) {
return this.#marker in key;
}
delete(key) {
delete key[this.#marker];
}
}
ìììì ê°ì´, MyWeakMap
ë í¤ ì½ë ì
ì ì¤ì ë¡ ë³´ì íì§ ììµëë¤. MyWeakMap
ì ë¨ìí ì ë¬ë°ì ê° ê°ì²´ì ë©íë°ì´í°ë¥¼ ì¶ê°í©ëë¤. ê·¸ ê°ì²´ë ì´í íìí기-ì¸ê¸°ë¥¼ íµí´ ê°ë¹ì§ ì½ë ì
ê°ë¥íê² ë©ëë¤. ê·¸ë¬ë¯ë¡, WeakMap
ì í¤ë¥¼ ìííê±°ë WeakMap
ì í¤ë¥¼ 모ë ì§ì°ë ê²(clear)ì ë¶ê°ë¥í©ëë¤(clear ììë ì ì²´ í¤ ì½ë ì
ì ë³´ì ìì¡´í©ëë¤).
ì¢ ë ìì¸í APIë keyed collections ê°ì´ëìì íì¸íì¤ ì ììµëë¤.
WeakRefsì FinalizationRegistryNote:
WeakRef
ìFinalizationRegistry
ë ê°ë¹ì§ ìì§ êµ¬ì¡°ì ëí ì§ì ì ì¸ ë´ë¶ íìì ì ê³µí©ëë¤. ë°íì ì맨í±ì ìì í ë³´ì¥ë ì ì기ì ê°ë¥íë©´ ì¬ì©íì§ ìë ê²ì ê¶ì¥í©ëë¤.
ê°ì´ ê°ì²´ì¸ 모ë ë³ìë¤ì í´ë¹ ê°ì²´ì ëí 참조ì
ëë¤. ê·¸ë¬ë, ê·¸ë¬í 참조ë "strong" í©ëë¤. ê·¸ë° ë³ìê° ìë¤ë©´ ê°ë¹ì§ 컬ë í°ê° ê°ì²´ë¥¼ ë§í¹íë ê²ì ë§ìµëë¤. WeakRef
ë ê°ì²´ì ëí "weak reference" ë¡ ì¤ë¸ì í¸ê° ê°ë¹ì§ ìì§ë ì ìëë¡ íë ëìì ê°ì²´ê° ì¡´ì¬íë ëì 컨í
ì¸ ì ì ê·¼íë ê²ì ê°ë¥íê² í©ëë¤.
WeakRef
ì í ê°ì§ ì¬ì© ì¬ë¡ë 문ìì´ URLì í° ê°ì²´ì 매ííë ìºììì¤í
ì
ëë¤. ì´ë° 목ì ì ìí´ WeakMap
를 ì¬ì©í ìë ìëë°, ê·¸ ì´ì ë WeakMap
ê°ì²´ë weakly heldì¸ "keys" 를 ê°ì§ë "values" ì ê·¸ë ì§ ì기 ë문ì
ëë¤. ë§ì½ í¤ì ì ê·¼íë©´, íì ê²°ì ì ì¼ë¡ ê°ì ì»ìµëë¤ (í¤ì ì ê·¼í ì ìë¤ë ê²ì´ í¤ê° ìì§ ì¡´ì¬íë¤ë ê²ì ì미í기 ë문ì). ì´ ë¶ë¶ìì, í¤ì ì ê·¼ ì undefined
를 ì»ë ê²ì (ë§ì½ ììí ê°ë ë©ëª¨ë¦¬ ìì ì¡´ì¬íì§ ìëë¤ë©´) ë¤ì ê³ì°íë©´ ë기ì ê´ì°®ì¼ë, ì°ë¦¬ë ëë¬í ì ìë ê°ì²´ê° ìºì ììì ì¡´ì¬í기ë ìíì§ ììµëë¤. ì´ë¬í ê²½ì°ì, ì°ë¦¬ë ì¼ë°ì ì¸ Map
ì ê°ê°ì ê°ì´ ê°ì²´ì ì¤ì ê°ì´ ìë WeakRef
ì´ ëëë¡ êµ¬ì±í ì ììµëë¤.
function cached(getter) {
// 문ìì´ URLê³¼ ê²°ê³¼ê°ì WeakRefs를 ì°ê²°íë Map
const cache = new Map();
return async (key) => {
if (cache.has(key)) {
return cache.get(key).deref();
}
const value = await getter(key);
cache.set(key, new WeakRef(value));
return value;
};
}
const getImage = cached((url) => fetch(url).then((res) => res.blob()));
FinalizationRegistry
ë ê°ë¹ì§ ìì§ì ê´ì°°í기 ìí´ ëì± ê°ë ¥í ë©ì»¤ëì¦ì ì ê³µí©ëë¤. FinalizationRegistry
ë ê°ì²´ë¥¼ ë±ë¡íê³ ê°ë¹ì§ ìì§ëìì ë ì림ì ë°ì ì ìëë¡ í©ëë¤. ììë¡, ìì ììë¡ ìì±ë ìºì ìì¤í
ìì, ê°ì²´ê° ì¤ì ê°ì ë³´ì íê³ ìëì§ ì¬ë¶ì ìê´ìì´ WeakRef
ì¤ì ê°ì´ ê°ë¹ì§ ì½ë ì
ëìì´ ë©ëë¤. ëí ìê°ì´ í르며 Map
ì ë¤ëì ì미ìë í목ë¤ì ì¶ì íê² ë©ëë¤. FinalizationRegistry
를 ì¬ì©íì¬ ìëì ê°ì´ í´ì 를 í ì ììµëë¤.
function cached(getter) {
// 문ìì´ URLê³¼ ê²°ê³¼ê°ì WeakRefs를 ì°ê²°íë Map
const cache = new Map();
// ê°ì´ ê°ë¹ì§ ìì§ë ëë§ë¤, ìºìì í¤ê° ì¸ìì¸ ì½ë°±ì´ í¸ì¶ëì´
// ìºì í목ì ì ê±°í ì ìëë¡ í¨
const registry = new FinalizationRegistry((key) => {
// Note: WeakRefê° ì ë§ë¡ ë¹ìëì§ í
ì¤í¸íë ê²ì´ ë§¤ì° ì¤ìí©ëë¤.
// ê·¸ë¬ì§ ìëë¤ë©´, ì½ë°±ì´ ìë¡ì´ ê°ì²´ê° ì´ í¤ë¡ ì¶ê°ë ì´í í¸ì¶ëê³
// ìë¡ê² ìì±ë ë©ëª¨ë¦¬ ìì ì¤ë¸ì í¸ê° ìì ë ì ììµëë¤.
if (!cache.get(key)?.deref()) {
cache.delete(key);
}
});
return async (key) => {
if (cache.has(key)) {
return cache.get(key).deref();
}
const value = await getter(key);
cache.set(key, new WeakRef(value));
registry.register(value, key);
return value;
};
}
const getImage = cached((url) => fetch(url).then((res) => res.blob()));
ì±ë¥ê³¼ ë³´ìì 측면ìì, ì íí ì´ë ìì ì ì½ë°±ì´ í¸ì¶ë ì§, ë°ëì í¸ì¶ë ì§ ë³´ì¥í ì ììµëë¤. FinalizationRegistry
ë ì¤ì§ ì¤ìíì§ ìì í´ì 를 ìí´ìë§ ì¬ì©ëì´ì¼ í©ëë¤. ì´ ë°ìë íì finally
ë¸ë¡ì ìííë try...finally
ì ê°ì ì¢ ë ê²°ì ì ì¸ ë¦¬ìì¤ ê´ë¦¬ ë°©ìì´ ììµëë¤. WeakRef
ì FinalizationRegistry
ì ìì í ì¥ìê° ì¤íëë íë¡ê·¸ë¨ì ë©ëª¨ë¦¬ ì¬ì© ìµì í를 ìí´ ì¡´ì¬í©ëë¤.
WeakRef
ì FinalizationRegistry
를 íµí´ ê°ê°ì ìì¸í API를 ì¶ê°ì ì¼ë¡ íì¸íì¤ ì ììµëë¤.
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