æç€ºçãªãœãŒã¹ç®¡çã§JavaScriptã¢ããªã®ä¿¡é Œæ§ãšæ§èœãåäžããusingã宣èšãWeakRefçã«ããèªåã¯ãªãŒã³ã¢ããæè¡ã§å ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãã
JavaScriptæç€ºçãªãœãŒã¹ç®¡çïŒã¯ãªãŒã³ã¢ããèªååã®ç¿åŸ
JavaScriptéçºã®äžçã§ã¯ãå ç¢ã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ããªãœãŒã¹ãå¹ççã«ç®¡çããããšãäžå¯æ¬ ã§ããJavaScriptã®ã¬ããŒãžã³ã¬ã¯ã¿ïŒGCïŒã¯ãå°éäžèœã«ãªã£ããªããžã§ã¯ããå æããã¡ã¢ãªãèªåçã«è§£æŸããŸãããGCã ãã«äŸåãããšãäºæž¬äžå¯èœãªåäœããªãœãŒã¹ãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããããã§æç€ºçãªãªãœãŒã¹ç®¡çãéèŠã«ãªããŸããæç€ºçãªãªãœãŒã¹ç®¡çã«ãããéçºè ã¯ãªãœãŒã¹ã®ã©ã€ããµã€ã¯ã«ããã詳现ã«å¶åŸ¡ã§ããã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ãããä¿èšŒããæœåšçãªåé¡ã鲿¢ã§ããŸãã
æç€ºçãªãªãœãŒã¹ç®¡çã®å¿ èŠæ§ãçè§£ãã
JavaScriptã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯åŒ·åãªã¡ã«ããºã ã§ãããåžžã«æ±ºå®è«çã§ãããšã¯éããŸãããGCã¯å®æçã«å®è¡ãããŸããããã®æ£ç¢ºãªå®è¡ã¿ã€ãã³ã°ã¯äºæž¬äžå¯èœã§ããããã¯ãè¿ éã«è§£æŸããå¿ èŠããããªãœãŒã¹ãæ±ãéã«åé¡ãåŒãèµ·ããå¯èœæ§ããããŸããäŸãã°ã以äžã®ãããªãªãœãŒã¹ã§ãïŒ
- ãã¡ã€ã«ãã³ãã«ïŒãã¡ã€ã«ãã³ãã«ãéãããŸãŸã«ãããšãã·ã¹ãã ãªãœãŒã¹ãæ¯æžãããä»ã®ããã»ã¹ããã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªããªãå¯èœæ§ããããŸãã
- ãããã¯ãŒã¯æ¥ç¶ïŒéããããŠããªããããã¯ãŒã¯æ¥ç¶ã¯ããµãŒããŒãªãœãŒã¹ãæ¶è²»ããæ¥ç¶ãšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ïŒããŒã¿ããŒã¹æ¥ç¶ãé·æéä¿æãããšãããŒã¿ããŒã¹ãªãœãŒã¹ã«è² è·ãããããã¯ãšãªã®ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
- ã€ãã³ããªã¹ããŒïŒã€ãã³ããªã¹ããŒãåé€ãå¿ãããšãã¡ã¢ãªãªãŒã¯ãäºæãã¬åäœã«ã€ãªããå¯èœæ§ããããŸãã
- ã¿ã€ããŒïŒãã£ã³ã»ã«ãããŠããªãã¿ã€ããŒã¯ç¡æéã«å®è¡ããç¶ãããªãœãŒã¹ãæ¶è²»ãããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
- å€éšããã»ã¹ïŒåããã»ã¹ãèµ·åããéããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ãªã©ã®ãªãœãŒã¹ã¯æç€ºçãªã¯ãªãŒã³ã¢ãããå¿ èŠã«ãªãå ŽåããããŸãã
æç€ºçãªãªãœãŒã¹ç®¡çã¯ãã¬ããŒãžã³ã¬ã¯ã¿ããã€å®è¡ããããã«é¢ãããããããã®ãªãœãŒã¹ãè¿ éã«è§£æŸãããããšãä¿èšŒããæ¹æ³ãæäŸããŸããããã«ãããéçºè ã¯ãªãœãŒã¹ãäžèŠã«ãªã£ããšãã«å®è¡ãããã¯ãªãŒã³ã¢ããããžãã¯ãå®çŸ©ã§ãããªãœãŒã¹ãªãŒã¯ãé²ããã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãåäžãããããšãã§ããŸãã
åŸæ¥ã®ãªãœãŒã¹ç®¡çã¢ãããŒã
çŸä»£çãªæç€ºçãªãœãŒã¹ç®¡çæ©èœãç»å Žããåã¯ãéçºè ã¯JavaScriptã§ãªãœãŒã¹ã管çããããã«ãããã€ãã®äžè¬çãªææ³ã«äŸåããŠããŸããïŒ
1. try...finally
ãããã¯
try...finally
ãããã¯ã¯ãtry
ãããã¯ã§äŸå€ãã¹ããŒããããã©ããã«é¢ããããfinally
ãããã¯å
ã®ã³ãŒãã®å®è¡ãä¿èšŒããåºæ¬çãªå¶åŸ¡ãããŒæ§é ã§ããããã«ãããã¯ãªãŒã³ã¢ããã³ãŒããåžžã«å®è¡ãããããšã確å®ã«ããä¿¡é Œæ§ã®é«ãæ¹æ³ãšãªããŸãã
äŸïŒ
function processFile(filePath) {
let fileHandle;
try {
fileHandle = fs.openSync(filePath, 'r');
// ãã¡ã€ã«ãåŠç
const data = fs.readFileSync(fileHandle);
console.log(data.toString());
} finally {
if (fileHandle) {
fs.closeSync(fileHandle);
console.log('ãã¡ã€ã«ãã³ãã«ãéããããŸããã');
}
}
}
ãã®äŸã§ã¯ããã¡ã€ã«ã®åŠçäžã«ãšã©ãŒãçºçããå Žåã§ããfinally
ãããã¯ã«ãã£ãŠãã¡ã€ã«ãã³ãã«ã確å®ã«éããããŸãã广çã§ã¯ãããŸãããtry...finally
ã䜿çšãããšãç¹ã«è€æ°ã®ãªãœãŒã¹ãæ±ãå Žåã«åé·ã§ç¹°ãè¿ããå€ããªãå¯èœæ§ããããŸãã
2. dispose
ãŸã㯠close
ã¡ãœããã®å®è£
ããäžã€ã®äžè¬çãªã¢ãããŒãã¯ããªãœãŒã¹ã管çãããªããžã§ã¯ãã« dispose
ãŸã㯠close
ã¡ãœãããå®çŸ©ããããšã§ãããã®ã¡ãœããã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããããžãã¯ãã«ãã»ã«åããŸãã
äŸïŒ
class DatabaseConnection {
constructor(connectionString) {
this.connection = connectToDatabase(connectionString);
}
query(sql) {
return this.connection.query(sql);
}
close() {
this.connection.close();
console.log('ããŒã¿ããŒã¹æ¥ç¶ãéããããŸããã');
}
}
// äœ¿çšæ¹æ³ïŒ
const db = new DatabaseConnection('your_connection_string');
try {
const results = db.query('SELECT * FROM users');
console.log(results);
} finally {
db.close();
}
ãã®ã¢ãããŒãã¯ããªãœãŒã¹ã管çããããã®æç¢ºã§ã«ãã»ã«åãããæ¹æ³ãæäŸããŸãããããããªãœãŒã¹ãäžèŠã«ãªã£ããšãã«éçºè
ã dispose
ãŸã㯠close
ã¡ãœãããåŒã³åºãããšãèŠããŠããå¿
èŠããããŸããã¡ãœãããåŒã³åºãããªãå ŽåããªãœãŒã¹ã¯éãããŸãŸã«ãªãããªãœãŒã¹ãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸãã
çŸä»£ã®æç€ºçãªãœãŒã¹ç®¡çæ©èœ
çŸä»£ã®JavaScriptã«ã¯ããªãœãŒã¹ç®¡çãç°¡çŽ åãèªååããããã€ãã®æ©èœãå°å ¥ãããŠãããå ç¢ã§ä¿¡é Œæ§ã®é«ãã³ãŒããæžãããããªã£ãŠããŸãããããã®æ©èœã«ã¯ä»¥äžãå«ãŸããŸãïŒ
1. using
宣èš
using
宣èšã¯ãJavaScriptã®æ°æ©èœïŒæ°ããããŒãžã§ã³ã®Node.jsããã©ãŠã¶ã§å©çšå¯èœïŒã§ããªãœãŒã¹ã宣èšçã«ç®¡çããæ¹æ³ãæäŸããŸãããªããžã§ã¯ããã¹ã³ãŒãå€ã«åºããšãã«ããã®ãªããžã§ã¯ãã® Symbol.dispose
ãŸã㯠Symbol.asyncDispose
ã¡ãœãããèªåçã«åŒã³åºããŸãã
using
宣èšã䜿çšããã«ã¯ããªããžã§ã¯ãã Symbol.dispose
ïŒåæã¯ãªãŒã³ã¢ããçšïŒãŸã㯠Symbol.asyncDispose
ïŒéåæã¯ãªãŒã³ã¢ããçšïŒã®ããããã®ã¡ãœãããå®è£
ããŠããå¿
èŠããããŸãããããã®ã¡ãœããã«ã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããããžãã¯ãå«ãŸããŸãã
äŸïŒåæã¯ãªãŒã³ã¢ããïŒïŒ
class FileWrapper {
constructor(filePath) {
this.filePath = filePath;
this.fileHandle = fs.openSync(filePath, 'r+');
}
[Symbol.dispose]() {
fs.closeSync(this.fileHandle);
console.log(`${this.filePath} ã®ãã¡ã€ã«ãã³ãã«ãéããããŸãã`);
}
read() {
return fs.readFileSync(this.fileHandle).toString();
}
}
{
using file = new FileWrapper('my_file.txt');
console.log(file.read());
// 'file'ãã¹ã³ãŒããæãããšããã¡ã€ã«ãã³ãã«ã¯èªåçã«éããããŸãã
}
ãã®äŸã§ã¯ãusing
宣èšã«ãããfile
ãªããžã§ã¯ããã¹ã³ãŒãå€ã«åºããšãã«ãã¡ã€ã«ãã³ãã«ãèªåçã«éããããããšãä¿èšŒãããŸããSymbol.dispose
ã¡ãœãããæé»çã«åŒã³åºããããããæåã§ã®ã¯ãªãŒã³ã¢ããã³ãŒããäžèŠã«ãªããŸããã¹ã³ãŒãã¯äžæ¬åŒ§ {}
ã§äœæãããŸããã¹ã³ãŒããäœæãããªãå Žåãfile
ãªããžã§ã¯ãã¯ååšãç¶ããŸãã
äŸïŒéåæã¯ãªãŒã³ã¢ããïŒïŒ
const fsPromises = require('fs').promises;
class AsyncFileWrapper {
constructor(filePath) {
this.filePath = filePath;
this.fileHandle = null;
}
async open() {
this.fileHandle = await fsPromises.open(this.filePath, 'r+');
}
async [Symbol.asyncDispose]() {
if (this.fileHandle) {
await this.fileHandle.close();
console.log(`${this.filePath} ã®éåæãã¡ã€ã«ãã³ãã«ãéããããŸãã`);
}
}
async read() {
const buffer = await fsPromises.readFile(this.fileHandle);
return buffer.toString();
}
}
async function main() {
{
const file = new AsyncFileWrapper('my_async_file.txt');
await file.open();
using a = file; // éåæã³ã³ããã¹ããå¿
èŠã§ãã
console.log(await file.read());
// 'file'ãã¹ã³ãŒããæãããšããã¡ã€ã«ãã³ãã«ã¯èªåçã«éåæã§éããããŸãã
}
}
main();
ãã®äŸã¯ãSymbol.asyncDispose
ã¡ãœããã䜿çšããéåæã¯ãªãŒã³ã¢ããã瀺ããŠããŸããusing
宣èšã¯ã次ã«é²ãåã«éåæã¯ãªãŒã³ã¢ããæäœã®å®äºãèªåçã«åŸ
ã¡ãŸãã
2. WeakRef
ãš FinalizationRegistry
WeakRef
ãš FinalizationRegistry
ã¯ããªããžã§ã¯ãã®ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã远跡ãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«ã¯ãªãŒã³ã¢ããã¢ã¯ã·ã§ã³ãå®è¡ããã¡ã«ããºã ãæäŸããã2ã€ã®åŒ·åãªæ©èœã§ãã
WeakRef
ïŒWeakRef
ã¯ãåç §å ã®ãªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã¿ã«ãã£ãŠååãããã®ã劚ããªãç¹æ®ãªåç §ã§ãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãWeakRef
ã¯ç©ºã«ãªããŸããFinalizationRegistry
ïŒFinalizationRegistry
ã¯ããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«å®è¡ãããã³ãŒã«ããã¯é¢æ°ãç»é²ã§ããã¬ãžã¹ããªã§ããã³ãŒã«ããã¯é¢æ°ã¯ããªããžã§ã¯ããç»é²ããéã«æäŸããããŒã¯ã³ãšå ±ã«åŒã³åºãããŸãã
ãããã®æ©èœã¯ããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ãçŽæ¥å¶åŸ¡ã§ããªãå€éšã·ã¹ãã ãã©ã€ãã©ãªã«ãã£ãŠç®¡çããããªãœãŒã¹ãæ±ãå Žåã«ç¹ã«äŸ¿å©ã§ãã
äŸïŒ
let registry = new FinalizationRegistry(
(heldValue) => {
console.log('ã¯ãªãŒã³ã¢ããäž', heldValue);
// ããã§ã¯ãªãŒã³ã¢ããåŠçãå®è¡ããŸã
}
);
let obj = {};
registry.register(obj, 'some value');
obj = null;
// objãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãFinalizationRegistryã®ã³ãŒã«ããã¯ãå®è¡ãããŸãã
ãã®äŸã§ã¯ãFinalizationRegistry
ã䜿çšããŠãobj
ãªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«å®è¡ãããã³ãŒã«ããã¯é¢æ°ãç»é²ããŠããŸããã³ãŒã«ããã¯é¢æ°ã¯ãã¯ãªãŒã³ã¢ããããããªããžã§ã¯ããèå¥ããããã«äœ¿çšã§ããããŒã¯ã³ 'some value'
ãåãåããŸãã`obj = null;` ã®çŽåŸã«ã³ãŒã«ããã¯ãå®è¡ãããããšã¯ä¿èšŒãããŠããŸãããã¬ããŒãžã³ã¬ã¯ã¿ãã¯ãªãŒã³ã¢ããã®æºåãã§ãããšãã«å€æããŸãã
å€éšãªãœãŒã¹ã䜿çšããå®è·µçãªäŸïŒ
class ExternalResource {
constructor() {
this.id = generateUniqueId();
// allocateExternalResourceãå€éšã·ã¹ãã ã§ãªãœãŒã¹ãå²ãåœãŠããšä»®å®
allocateExternalResource(this.id);
console.log(`å€éšãªãœãŒã¹ãID: ${this.id} ã§å²ãåœãŠãŸãã`);
}
cleanup() {
// freeExternalResourceãå€éšã·ã¹ãã ã§ãªãœãŒã¹ãè§£æŸãããšä»®å®
freeExternalResource(this.id);
console.log(`å€éšãªãœãŒã¹ID: ${this.id} ãè§£æŸããŸãã`);
}
}
const finalizationRegistry = new FinalizationRegistry((resourceId) => {
console.log(`å€éšãªãœãŒã¹ID: ${resourceId} ãã¯ãªãŒã³ã¢ããäž`);
freeExternalResource(resourceId);
});
let resource = new ExternalResource();
finalizationRegistry.register(resource, resource.id);
resource = null; // ããã§ãªãœãŒã¹ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ãšãªããŸãã
// ãã°ããããŠããã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ããªãã¯ãªãŒã³ã¢ããã³ãŒã«ããã¯ãå®è¡ããŸãã
3. éåæã€ãã¬ãŒã¿ãš Symbol.asyncDispose
éåæã€ãã¬ãŒã¿ãæç€ºçãªãªãœãŒã¹ç®¡çã®æ©æµãåããããšãã§ããŸããéåæã€ãã¬ãŒã¿ããªãœãŒã¹ïŒäŸïŒã¹ããªãŒã ïŒãä¿æããŠããå Žåãã€ãã¬ãŒã·ã§ã³ãå®äºãããšãããŸãã¯éäžã§çµäºãããšãã«ããããã®ãªãœãŒã¹ãè§£æŸãããããšãä¿èšŒããããšãéèŠã§ãã
éåæã€ãã¬ãŒã¿ã« Symbol.asyncDispose
ãå®è£
ããŠã¯ãªãŒã³ã¢ãããåŠçã§ããŸãïŒ
class AsyncResourceIterator {
constructor(filePath) {
this.filePath = filePath;
this.fileHandle = null;
this.iterator = null;
}
async open() {
const fsPromises = require('fs').promises;
this.fileHandle = await fsPromises.open(this.filePath, 'r');
this.iterator = this.#createIterator();
return this;
}
async *#createIterator() {
const fsPromises = require('fs').promises;
const stream = this.fileHandle.readableWebStream();
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
yield new TextDecoder().decode(value);
}
} finally {
reader.releaseLock();
}
}
async [Symbol.asyncDispose]() {
if (this.fileHandle) {
await this.fileHandle.close();
console.log(`éåæã€ãã¬ãŒã¿ããã¡ã€ã«ãéããŸãã: ${this.filePath}`);
}
}
[Symbol.asyncIterator]() {
return this.iterator;
}
}
async function processFile(filePath) {
const resourceIterator = new AsyncResourceIterator(filePath);
await resourceIterator.open();
try {
using fileIterator = resourceIterator;
for await (const chunk of fileIterator) {
console.log(chunk);
}
// fileã¯ããã§èªåçã«disposeãããŸã
} catch (error) {
console.error("ãã¡ã€ã«åŠçãšã©ãŒ:", error);
}
}
processFile("my_large_file.txt");
æç€ºçãªãªãœãŒã¹ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
JavaScriptã§æç€ºçãªãªãœãŒã¹ç®¡çã广çã«æŽ»çšããããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- æç€ºçãªã¯ãªãŒã³ã¢ãããå¿ èŠãªãªãœãŒã¹ãç¹å®ããïŒã¢ããªã±ãŒã·ã§ã³å ã®ã©ã®ãªãœãŒã¹ãããªãŒã¯ãããã©ãŒãã³ã¹åé¡ãåŒãèµ·ããå¯èœæ§ãããããæç€ºçãªã¯ãªãŒã³ã¢ãããå¿ èŠãšãããã倿ããŸããããã«ã¯ããã¡ã€ã«ãã³ãã«ããããã¯ãŒã¯æ¥ç¶ãããŒã¿ããŒã¹æ¥ç¶ãã¿ã€ããŒãã€ãã³ããªã¹ããŒãå€éšããã»ã¹ãã³ãã«ãå«ãŸããŸãã
- åçŽãªã·ããªãªã«ã¯
using
宣èšã䜿çšããïŒusing
宣èšã¯ãåæçãŸãã¯éåæçã«ã¯ãªãŒã³ã¢ããã§ãããªãœãŒã¹ã管çããããã®æšå¥šãããã¢ãããŒãã§ããã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ãããä¿èšŒããããã®ã¯ãªãŒã³ã§å®£èšçãªæ¹æ³ãæäŸããŸãã - å€éšãªãœãŒã¹ã«ã¯
WeakRef
ãšFinalizationRegistry
ã䜿çšããïŒå€éšã·ã¹ãã ãã©ã€ãã©ãªã«ãã£ãŠç®¡çããããªãœãŒã¹ãæ±ãå Žåã¯ãWeakRef
ãšFinalizationRegistry
ã䜿çšããŠãªããžã§ã¯ãã®ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã远跡ãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«ã¯ãªãŒã³ã¢ããã¢ã¯ã·ã§ã³ãå®è¡ããŸãã - å¯èœãªéãéåæã¯ãªãŒã³ã¢ãããåªå
ããïŒã¯ãªãŒã³ã¢ããæäœã«I/Oããã®ä»ã®ããããã³ã°ã®å¯èœæ§ãããæäœãå«ãŸããå Žåã¯ãã¡ã€ã³ã¹ã¬ããããããã¯ããªãããã«éåæã¯ãªãŒã³ã¢ããïŒ
Symbol.asyncDispose
ïŒã䜿çšããŸãã - äŸå€ãæ
éã«åŠçããïŒã¯ãªãŒã³ã¢ããã³ãŒããäŸå€ã«å¯ŸããŠå埩åãããããšã確èªããŸãã
try...finally
ãããã¯ã䜿çšããŠããšã©ãŒãçºçããå Žåã§ãã¯ãªãŒã³ã¢ããã³ãŒããåžžã«å®è¡ãããããšãä¿èšŒããŸãã - ã¯ãªãŒã³ã¢ããããžãã¯ããã¹ãããïŒãªãœãŒã¹ãæ£ããè§£æŸããããªãœãŒã¹ãªãŒã¯ãçºçããŠããªãããšã確èªããããã«ãã¯ãªãŒã³ã¢ããããžãã¯ã培åºçã«ãã¹ãããŸãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãªãœãŒã¹äœ¿çšéãç£èŠããæœåšçãªåé¡ãç¹å®ããŸãã
- ããªãã£ã«ãšãã©ã³ã¹ãã¬ãŒã·ã§ã³ãæ€èšããïŒ`using` 宣èšã¯æ¯èŒçæ°ããæ©èœã§ããå€ãç°å¢ããµããŒãããå¿ èŠãããå Žåã¯ãBabelãTypeScriptãªã©ã®ãã©ã³ã¹ãã€ã©ãšé©åãªããªãã£ã«ã䜿çšããŠäºææ§ãæäŸããããšãæ€èšããŠãã ããã
æç€ºçãªãªãœãŒã¹ç®¡çã®å©ç¹
JavaScriptã¢ããªã±ãŒã·ã§ã³ã«æç€ºçãªãªãœãŒã¹ç®¡çãå®è£ ãããšãããã€ãã®å€§ããªå©ç¹ããããŸãïŒ
- ä¿¡é Œæ§ã®åäžïŒãªãœãŒã¹ã®ã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ãããä¿èšŒããããšã§ãæç€ºçãªãªãœãŒã¹ç®¡çã¯ãªãœãŒã¹ãªãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã¯ã©ãã·ã¥ã®ãªã¹ã¯ãäœæžããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒãªãœãŒã¹ãè¿ éã«è§£æŸããããšã§ã·ã¹ãã ãªãœãŒã¹ãè§£æŸãããç¹ã«å€æ°ã®ãªãœãŒã¹ãæ±ãå Žåã«ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸãã
- äºæž¬å¯èœæ§ã®åäžïŒæç€ºçãªãªãœãŒã¹ç®¡çã¯ãªãœãŒã¹ã®ã©ã€ããµã€ã¯ã«ã«å¯Ÿãããã倧ããªå¶åŸ¡ãæäŸããã¢ããªã±ãŒã·ã§ã³ã®åäœãããäºæž¬å¯èœã«ãããããã°ã容æã«ããŸãã
- ãããã°ã®ç°¡çŽ åïŒãªãœãŒã¹ãªãŒã¯ã¯èšºæãšãããã°ãå°é£ãªå ŽåããããŸããæç€ºçãªãªãœãŒã¹ç®¡çã«ããããªãœãŒã¹é¢é£ã®åé¡ãç¹å®ããä¿®æ£ããããšã容æã«ãªããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäžïŒæç€ºçãªãªãœãŒã¹ç®¡çã¯ãããã¯ãªãŒã³ã§æŽçãããã³ãŒããä¿é²ããçè§£ãšä¿å®ã容æã«ããŸãã
çµè«
æç€ºçãªãªãœãŒã¹ç®¡çã¯ãå
ç¢ã§ããã©ãŒãã³ã¹ã®é«ãJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§äžå¯æ¬ ãªåŽé¢ã§ããæç€ºçãªã¯ãªãŒã³ã¢ããã®å¿
èŠæ§ãçè§£ããusing
宣èšãWeakRef
ãFinalizationRegistry
ã®ãããªçŸä»£çãªæ©èœã掻çšããããšã§ãéçºè
ã¯ã¿ã€ã ãªãŒãªãªãœãŒã¹è§£æŸãä¿èšŒãããªãœãŒã¹ãªãŒã¯ãé²ããã¢ããªã±ãŒã·ã§ã³å
šäœã®å®å®æ§ãšããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããããã®æè¡ãæ¡çšããããšã¯ã倿§ãªåœéçæèã«ãããçŸä»£ã®Webéçºã®èŠæ±ã«å¿ããããã«äžå¯æ¬ ãªãããä¿¡é Œæ§ãé«ããä¿å®å¯èœã§ãã¹ã±ãŒã©ãã«ãªJavaScriptã³ãŒãã«ã€ãªãããŸãã