FinalizationRegistry.prototype.unregister()

The unregister() method unregisters a target object from a FinalizationRegistry instance.

Syntax

unregister(unregisterToken);

Parameters

unregisterToken

The token used with the register method when registering the target object.

Return value

undefined.

Notes

When a target object has been reclaimed, it is no longer registered in the registry. There is no need to call unregister in your cleanup callback. Only call unregister if you haven't received a cleanup callback and no longer need to receive one.

Examples

Using unregister

This example shows registering a target object using that same object as the unregister token, then later unregistering it via unregister:

class Thingy {
    #cleanup = label => {
    //         ^^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ held value
        console.error(
            `The \`release\` method was never called for the object with the label "${label}"`
        );
    };
    #registry = new FinalizationRegistry(this.#cleanup);

    /**
     * Constructs a `Thingy` instance. Be sure to call `release` when you're done with it.
     *
     * @param   label       A label for the `Thingy`.
     */
    constructor(label) {
        //                            vvvvvβˆ’βˆ’βˆ’βˆ’βˆ’ held value
        this.#registry.register(this, label, this);
        //          target βˆ’βˆ’βˆ’βˆ’βˆ’^^^^         ^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ unregister token
    }

    /**
     * Releases resources held by this `Thingy` instance.
     */
    release() {
        this.#registry.unregister(this);
        //                        ^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ unregister token
    }
}

This example shows registering a target object using a different object as its unregister token:

 {
    //         ^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ held value
        console.error(
            `The \`release\` method was never called for the \`Thingy\` for the file "${file.name}"`
        );
    };
    #registry = new FinalizationRegistry(this.#cleanup);

    /**
     * Constructs a `Thingy` instance for the given file. Be sure to call `release` when you're done with it.
     *
     * @param   filename    The name of the file.
     */
    constructor(filename) {
        this.#file = File.open(filename);
        //                            vvvvvβˆ’βˆ’βˆ’βˆ’βˆ’ held value
        this.#registry.register(this, label, this.#file);
        //          target βˆ’βˆ’βˆ’βˆ’βˆ’^^^^         ^^^^^^^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ unregister token
    }

    /**
     * Releases resources held by this `Thingy` instance.
     */
    release() {
        if (this.#file) {
            this.#registry.unregister(this.#file);
            //                        ^^^^^^^^^^βˆ’βˆ’βˆ’βˆ’βˆ’ unregister token
            File.close(this.#file);
            this.#file = null;
        }
    }
}

Specifications

Specification
ECMAScript Language Specification
# sec-finalization-registry.prototype.unregister

Browser compatibility

BCD tables only load in the browser

See also