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


Groups > comp.lang.javascript > #31215

Re: JSlint finds for loops intolerable

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups comp.lang.javascript
Subject Re: JSlint finds for loops intolerable
Date 2016-08-30 12:11 +0200
Organization PointedEars Software (PES)
Message-ID <3919372.LvFx2qVVIh@PointedEars.de> (permalink)
References <npug18$166s$1@gioia.aioe.org> <npuldh$q9l$1@solani.org>

Show all headers | View raw


Christoph M. Becker wrote:

> Once you get the hang of using Array.prototype.forEach(), you'll
> probably find many places where a more specific array method is more
> appropriate (for instance, .filter() and map()), and these can simplify
> the code (even more).

Yes, but:

Efficiency issues aside (while the callback is usually compiled only once, 
there is a *function call* for *each* iteration), one has to be really 
careful when refactoring loops to calls to iterating Array prototype methods 
because then in the callback you are in a *function* where things work 
differently.

For example, it will be difficult to impossible to convert a “for” or 
“while” loop that uses the ”break”, “continue” or “return” statements to 
*equivalent* callback code: “break” and “continue” are not allowed outside 
of loops.  “return” in a callback is equivalent to a “continue” without 
label, but there is no elegant equivalent for ”break” (keeping to call the 
callback and querying a non-local flag so that the callback returns early is 
_not_ elegant IMO), and “return” returns *from the callback*, _not_ from the 
function that called the Array method, so there is no elegant equivalent for 
that either.

One also has to deal with the fact that the “this” value in the callback is 
either the “undefined” value (strict mode) or a reference to the global 
object (otherwise) by default.  In an object’s method that used a loop, you 
have to pass the “this” value of the method as the second argument of a 
iterating native Array prototype method, and if you define your own general 
iteration method, you have to make a provision so that the user can call it 
like that [or they would have to pass theirCallback.bind(theirThis), which 
is comparably inefficient and not backwards-compatible].

I encountered these issues last week when I wanted to convert “for” loops in 
a jQuery-based application to .each() calls, as a jQuery array-like object 
was to be iterated over and this modification would have produced more 
uniform code – code that in the end would not have worked.
 
-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | SVN: <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | ES Matrix: <http://PointedEars.de/es-matrix>
Please do not cc me. / Bitte keine Kopien per E-Mail.

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


Thread

JSlint finds for loops intolerable emf <emfril@gmail.com> - 2016-08-28 06:56 -0400
  Re: JSlint finds for loops intolerable "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-08-28 14:28 +0200
    Re: JSlint finds for loops intolerable emf <emfril@gmail.com> - 2016-08-29 22:35 -0400
    Re: JSlint finds for loops intolerable Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2016-08-30 12:11 +0200
      Re: JSlint finds for loops intolerable "Christoph M. Becker" <cmbecker69@arcor.de> - 2016-09-03 20:54 +0200
      Re: JSlint finds for loops intolerable Scott Sauyet <scott@sauyet.com> - 2016-09-03 23:03 +0000
    Re: JSlint finds for loops intolerable Scott Sauyet <scott@sauyet.com> - 2016-09-03 22:47 +0000
  Re: JSlint finds for loops intolerable Lewis Perin <perin@panix.com> - 2016-08-28 16:50 -0400
    Re: JSlint finds for loops intolerable Lewis Perin <perin@panix.com> - 2016-08-28 18:49 -0400
      Re: JSlint finds for loops intolerable Lewis Perin <perin@panix.com> - 2016-08-28 19:13 -0400
  Re: JSlint finds for loops intolerable $Bill <news@todbe.com> - 2016-08-28 14:59 -0700

csiph-web