Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!gegeweb.42!gegeweb.eu!nntpfeed.proxad.net!proxad.net!feeder2-2.proxad.net!newsfeed.arcor.de!newsspool1.arcor-online.net!news.arcor.de.POSTED!not-for-mail Content-Type: text/plain; charset="UTF-8" Message-ID: <1344140.x7N3WIZj58@PointedEars.de> From: Thomas 'PointedEars' Lahn Reply-To: Thomas 'PointedEars' Lahn Organization: PointedEars Software (PES) Date: Fri, 03 Feb 2012 04:15:22 +0100 User-Agent: KNode/4.4.11 Content-Transfer-Encoding: 8Bit Subject: Re: Misspelling Can Bite You Newsgroups: comp.lang.javascript References: Followup-To: comp.lang.javascript MIME-Version: 1.0 Lines: 103 NNTP-Posting-Date: 03 Feb 2012 04:15:24 CET NNTP-Posting-Host: 70ed78cf.newsspool4.arcor-online.net X-Trace: DXC=a0MKhl;cdO8_A0jCfgHO6>4IUK Gene Wirchenko wrote: >> Once again, it is time to thank me for pointing a possible >> source of errors in JavaScript code or to chuckle over how I >> messed up again, maybe both. >> >> I misspelled the name of the control variable for a switch. >> I had >> switch (this.DateType) >> when it should have been >> switch (this.DataType) >> >> JavaScript was quite happy to execute the code. JavaScript may not even have been used. >> After all, >> the switch might have had a case to handle undefined. > > Really? Which browser, because the language's syntax won't stand for a - There is not *the* language with regard to browsers, unless you consider "JavaScript" to be a stand-in for "ECMAScript (implementations)", which is wrong. > case - clause inside a Block statement (and a - switch - isn't much use > without at least one - case - clause), so there should have been a > syntax error to prevent compilation, and so prevent any execution. I think he meant switch (this.bar) { case undefined: … } where the object referred to by `this' had a `foo' property instead. Only that in this case `foo' and `bar' were much more similar. Barring `this' referring to a host object or `bar' being a specially designed accessor property¹, any conforming implementation of ECMAScript Ed. 1 to 5.1 would execute that code without throwing an exception, with or without the `case undefined' clause, because you can attempt to access any property of the object referred to by `this' or the object converted from the value of `this' (ES 5.x strict mode) without it throwing an exception. Accessing a non-existing property merely results in `undefined'. (I am presently not aware of any feature in ES 5.1 that would change that behavior. Strict mode is not it. SpiderMonkey's __noSuchMethod__ property² only allows it for method calls. ES Harmony is going to allow it with dynamic proxies, but not on regular objects.³) ¹ Object.defineProperty(this, "bar", { get: function () { throw new TypeError(); } }); ² this.__noSuchMethod__ = function (id, args) { throw new Error(id + "(" + args.join(", ") + ")"); }; this.bar(); ³ var o = Proxy.create({ get: function (rcvr, name) { if (name == "bar") { throw new TypeError(); } } }, this); o.bar; See also > However, the situation you describe, of mistyping a keyword and still > having code execute is a possibility. One example would be mistyping - > if - to give:- > > id(x) > { > y = 12; > } > > - which would produce a runtime error, "id is not a function", rather > than a syntax error. > […] While this is valuable information indeed, I think you have misunderstood the OP. PointedEars -- Sometimes, what you learn is wrong. If those wrong ideas are close to the root of the knowledge tree you build on a particular subject, pruning the bad branches can sometimes cause the whole tree to collapse. -- Mike Duffy in cljs,