Misspelling Can Bite You

G

Gene Wirchenko

Dear JavaScripters:

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. After all, the
switch might have had a case to handle undefined.

Sincerely,

Gene Wirchenko
 
G

Gene Wirchenko

Really? Which browser, because the language's syntax won't stand for a -

IE 9.
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.

Huh? The sequence was syntactically correct. The only problem
with it was a misspelling of a property name. That corrected, the
code ran fine.
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:-

I described the result of misspelling a property name, not a
keyword.

[snip]

Sincerely,

Gene Wirchenko
 
T

Thomas 'PointedEars' Lahn

JavaScript may not even have been used.
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
<
S69WbK>
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
 
D

Dr J R Stockton

In comp.lang.javascript message <po1mi75fb0u5rqp9or413nv26799lpnndj@4ax.
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. After all, the
switch might have had a case to handle undefined.



Putting the following script element last, or making it a body onload
function, will list all the script words of more than 2 letters, in
alphabetical order, with the number of times used. The result will be
browser-dependent; but not gravely so. Demo in my js-misc1.htm.


<script type="text/javascript">

var skripts = document.getElementsByTagName("SCRIPT")
var L = skripts.length, Str = "", Out = []
while (L--) Str += skripts[L].innerHTML
Str = Str.split(/\W+/).sort()
var was = "", K = 0
L = Str.length
while (L--) {
if (Str[L] == was) K++ ; else {
if (was.length > 2 && /^[a-z]/i.test(was)) Out.push(K + " " + was)
K = 1 ; was = Str[L] } }
document.write("<pre>" + Out.reverse().join("\n") + "<\/pre>")

</script>


The code could, no doubt, be optimised. The output might better be to a
textarea or a new page. It could be well to NOT scan words in strings
or comment.


Code could be added to pick out cases where two adjacent words are
unreasonably similar.
 
M

Mel Smith

Dr. J said:
Code could be added to pick out cases where two adjacent words are
unreasonably similar.


Dr J and Gene:

This morning I was caught (and mislead) by the following set of two
statements:

var rgn = document.getElementById("iselectrgn") ;
var rgnopts = rgn.getElementsByTagname("option") ;

Because I *thought* I had checked the statements thoroughly, I looked
everywhere *after* this set, and finally went back and checked them again
letter-by-letter, and then ...

-Mel Smith
 
D

Dr J R Stockton

Sat said:
Dr. J said:



Dr J and Gene:

This morning I was caught (and mislead) by the following set of two
statements:

var rgn = document.getElementById("iselectrgn") ;
var rgnopts = rgn.getElementsByTagname("option") ;

Because I *thought* I had checked the statements thoroughly, I looked
everywhere *after* this set, and finally went back and checked them again
letter-by-letter, and then ...

Readily found by Firefox/Opera/Safari Error Console, Chrome JavaScript
Console, and by an IE8 pop-up, though.
 
M

Mel Smith

Dr. J said:
Readily found by Firefox/Opera/Safari Error Console, Chrome JavaScript
Console, and by an IE8 pop-up, though.

Yes, I use IE 7 on my dev machine, and 'once-in-a-while' (when I'm
nearing the production stage) I check out the appearance on Chrome and FF.

However, I didn't *this* time and spent a couple of confusing and
frustrating hours tracking down this 'devil'.

-Mel Smith
 
D

Dr J R Stockton

Mon said:
Dr. J said:

Yes, I use IE 7 on my dev machine, and 'once-in-a-while' (when I'm
nearing the production stage) I check out the appearance on Chrome and FF.

However, I didn't *this* time and spent a couple of confusing and
frustrating hours tracking down this 'devil'.

One fault with those Error Consoles is that they lack a "Stay On Top"
checkbox, or one for "Jump up when written to".

Re my earlier code : given a reference to a script element, one can get
..innerHTML and (in all my browsers) read as a string the script as
transmitted. Is there any easy way of getting that string, MINUS all
comment and MINUS all inner strings (or, in each case, removing the
content of the comments and strings) while leaving all the other code?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,571
Members
45,045
Latest member
DRCM

Latest Threads

Top