Fwd: Indirect references to variables

John Gardner gardnerjohng at gmail.com
Wed Dec 9 04:53:06 UTC 2015


ECMAScript currently offers no clean way to "dereference" a variable in the
current scope. For instance, assume an author wishes to obtain a reference
to a class using a variable that holds its name:

    class Paintbrush{  }

    let className = "Paintbrush";

    // Would only work in browsers, not NodeJS
    console.log( window[className] );

    // Doesn't even work in NodeJS
    console.log( global[className] || this[className] );

A hacky workaround is to create an anonymous function that simply returns a
reference to the named variable:

    function dereference(name){
        return new Function([], "return " + name)();
    }
    dereference("Paintbrush") === Paintbrush; // true

This isn't an elegant solution, nor a preferable one. Another approach
might be to leverage `eval`, which opens up the obvious issues of
performance and security.

Having a way of indirectly referencing another variable would fix this:

    class Paintbrush{  }

    let className       = "Paintbrush";

    let classReference  = \className;
    console.log(classReference === Paintbrush); // true

Sticking a backslash before a bareword identifier creates a reference to an
object whose name matches the identifier's string value. If no such object
exists in the current scope, it simply returns `undefined`.

I can't see this being used in everyday programs, but it would facilitate
Ajax programming considerably, where classes or functions can only be
specified by name:

    {"className":"Polygon", "vertices": [[0,0]...] }

    let meshClass = \ajaxData.className;
    if(meshClass instanceof Mesh){
        new meshClass(ajaxData.vertices);
    }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20151209/2541cfa4/attachment-0001.html>


More information about the es-discuss mailing list