Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #33680

Re: Reference var in (function(){})()

Path csiph.com!aioe.org!news.mb-net.net!open-news-network.org!.POSTED.69.235.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch!not-for-mail
From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups comp.lang.javascript
Subject Re: Reference var in (function(){})()
Date Wed, 02 Aug 2017 11:33:09 +0200
Organization PointedEars Software (PES)
Lines 95
Message-ID <1922855.Mh6RI2rZIc@PointedEars.de> (permalink)
References <KZ-dnfr95s94f-LEnZ2dnUU7-bnNnZ2d@westnet.com.au> <3122783.iIbC2pHGDl@PointedEars.de>
Reply-To Thomas 'PointedEars' Lahn <cljs@PointedEars.de>
Mime-Version 1.0
Content-Type text/plain; charset="UTF-8"
Content-Transfer-Encoding 8Bit
Injection-Info gwaiyur.mb-net.net; posting-host="69.235.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch:178.197.235.69"; logging-data="25884"; mail-complaints-to="abuse@open-news-network.org"
User-Agent KNode/4.14.2
X-User-ID U2FsdGVkX19Dp4nZStnDdUq+Jlwz9hsTjpGdRML2mbNNtrD/fGcQYQ==
Face iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg==
Cancel-Lock sha1:H61kpOChzwGTRR2cRSqCNdZS4/E=
X-Face %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&.<b';Md8`dH6iqhT)6C^.Px|[=M@7=Ik[_w<%n1Up"LPQNu2m8|L!/3iby{-]A+#YE}Kl{Cw$\U!kD%K}\2jz"QQP6Uqr],./"?;=4v
Xref csiph.com comp.lang.javascript:33680

Show key headers only | View raw


Thomas 'PointedEars' Lahn wrote:

> Andrew Poulos wrote:
>> I'd like to reference them in a for loop e.g.
>> 
>> for (i = 0; i < len; i++) {
>>    eval("opt" + i) = ...
>> }
>> 
>> but how can I do it without using eval?
> 
> You cannot.  Therefore, use an Array instance –
> 
>   […]
> 
> – or an Object instance –
> 
>   var con = (function () {
>     /* “opt” then refers to an object that does not inherit properties */
>     var opt = Object.assign(Object.create(null), {
>       0: {},
>       1: {},
>       2: {},
>       3: {}
>       // , ...
>     });
>  
>     function x ()
>     {
>       for (var i = 0; i < len; ++i)
>       {
>         // opt[i] = ...
>       }
>     }
> 
>     // x(…)
>   })();
> 
> – instead.

Note that, with exceptions, the better approach is not to rely on the scope 
chain, but to pass a reference to the pertaining object:
  
  var con = (function () {
    /* “opt” then refers to an object that does not inherit properties */
    var opt = Object.assign(Object.create(null), {
      0: {},
      1: {},
      2: {},
      3: {}
      // , ...
    });
 
    function x (obj)
    {
      for (var i = 0; i < len; ++i)
      {
        // obj[i] = ...
      }
    }

    // x(opt)
  })();

This way, not only is the effective scope chain shorter, which is faster, 
but also the function code can be moved elsewhere for reuse without 
necessarily modifying it further.  For example,

  function x (obj)
  {
    for (var i = 0; i < len; ++i)
    {
      // obj[i] = ...
    }
  }

  var con = (function () {
    /* “opt” then refers to an object that does not inherit properties */
    var opt = Object.assign(Object.create(null), {
      0: {},
      1: {},
      2: {},
      3: {}
      // , ...
    });
 
    // x(opt)
  })();

works just as well.

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Back to comp.lang.javascript | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

Reference var in (function(){})() Andrew Poulos <ap_prog@hotmail.com> - 2017-08-01 12:09 +1000
  Re: Reference var in (function(){})() "Evertjan." <exxjxw.hannivoort@inter.nl.net> - 2017-08-01 09:39 +0200
  Re: Reference var in (function(){})() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-08-01 12:40 +0200
    Re: Reference var in (function(){})() Andrew Poulos <ap_prog@hotmail.com> - 2017-08-02 14:06 +1000
      Re: Reference var in (function(){})() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-08-02 11:38 +0200
    Re: Reference var in (function(){})() Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2017-08-02 11:33 +0200

csiph-web