Search code examples
javascriptgarbage-collectionconstantsecmascript-6

Does ES6 const affect garbage collection?


In Kyle Simpson's new title, You don't know JS: ES6 and beyond, I find the following snippet:

WARNING Assigning an object or array as a constant means that value will not be able to be garbage collected until that constant’s lexical scope goes away, as the reference to the value can never be unset. That may be desirable, but be careful if it’s not your intent!

(Excerpt From: Simpson, Kyle. “You Don’t Know JS: ES6 & Beyond.” O'Reilly Media, Inc., 2015-06-02. iBooks. This material may be protected by copyright.)

As far as I can see, he doesn't expand on this, and 10 minutes on Google turns up nothing. Is this true, and if so, what does "the reference to the value can never be unset" mean exactly? I have got into the habit of declaring variables that won't be changed as const, is this a bad habit in real concrete performance/memory terms?


Solution

  • No, there are no performance implications. This note refers to the practise of helping the garbage collector (which is rarely enough needed) by "unsetting" the variable:

    {
        let x = makeHeavyObject();
        window.onclick = function() {
            // this *might* close over `x` even when it doesn't need it
        };
        x = null; // so we better clear it
    }
    

    This is obviously not possibly to do if you had declared x as a const.

    The lifetime of the variable (when it goes out of scope) is not affected by this. But if the garbage collector screws up, a constant will always hold the value it was initialised with, and prevent that from being garbage-collected as well, while a normal variable might no more hold it.