|
Also, come to find out, "use strict"; does not solve this anyways, because it thinks room is already defined as a function. Yes, it was silly of me to name my local var the same as the name of the function but that's another issue.
Use strict only tells you about things that are not defined. Of course room is defined as a function. Interesting.
So adding "use sctrict" does not solve this problem. Isn't that interesting?
There are many ways to shoot yourself in the foot and JavaScript is a machine gun!!
|
|
|
|
|
A convention in JS (and it is just a convention, I do not know if JSLint checks for it) is to name functions that are used as constructors with names starting with a capital letter and functions not used as constructors with names starting with lowercase letters (or $ or _). So, if you had used that convention, you would have written 'new Room()' and you would have been safe.
|
|
|
|
|
jsc42 wrote: A convention in JS (and it is just a convention, I do not know if JSLint checks for it) is to name functions that are used as constructors with names starting with a capital letter and functions not used as constructors with names starting with lowercase letters
A fantastic convention that is spot on for this problem. I really do try to follow conventions like that too, so I don't shoot myself in the foot, but alas, I am as lazy as anyone else who types code.
I'm definitely a slacker.
ala Marty McFly and Back To the Future[^]
It's a great point and I will incorporate that convention into my JS even when I'm typing fast.
|
|
|
|
|
As with all conventions, there are many: Where I work, we use _ to designate private stuff, and $ to designate DOM objects...
|
|
|
|
|
We use $nameGoesHere to indicate jQuery objects rather than just simple variables.
- I would love to change the world, but they won’t give me the source code.
|
|
|
|
|
Enfant terrible
|
|
|
|
|
is this the defintion you meant?
merriam-webster said: : a usually young and successful person who is strikingly unorthodox, innovative, or avant-garde
|
|
|
|
|
That's you
|
|
|
|
|
There are many reasons I love TypeScript. This is just one example.
This space for rent
|
|
|
|
|
Pete O'Hanlon wrote: There are many reasons I love TypeScript. This is just one example.
That is the perfect reply to this whole situation.
When I got stuck I was griping at myself for not using typsescript on this project.
|
|
|
|
|
"compilerOptions": {
"strict": true
}
Always.
|
|
|
|
|
Others have mentioned TypeScript, but to catch an error like this, you don't even need to go that far.
Set up ESLint with a good rule set (I like the one from Walmart Labs), and it'll scream at you if you forget to use var . Actually, with that rule set, it'll probably scream at you if you use var at all instead of let , and it'll scream at you again if you used let when you could have used const . It's a tad annoying at first, but it quickly drills good habits into you.
I love TypeScript too, but I find that sometimes, I just prefer to work in dynamically typed JavaScript over TypeScript - and when I do, ESLint helps me catch errors caused by typos and omissions. You'll need to use an editor that supports ESLint, but most of them do.
As for why the JS interpreter didn't catch this for you: you gave it syntactically valid code, and it just did what you asked it to! I know that's an annoying answer, but with JavaScript approaching its 25th birthday, it has lots of historical baggage and bits of the language that are probably best avoided. Hence my love of ESLint - it's a friendly pedant that reminds when when you step out of bounds.
TypeScript is also great, of course. And you can use TSLint too, to ensure your TypeScript code is as pedantically great as possible.
|
|
|
|
|
Ryan Peden wrote: Set up ESLint with a good rule set
That's a great idea. I will definitely look into it. Great post. Thanks.
|
|
|
|
|
It's not just JS, there's other languages where the compiler just chugs along trying to make sense of whatever code is there. VB isn't much better (although option strict and option explicit help). Or what about C? Ever had a nonsensical (it seems) error 14 lines later than where you made the mistake? And that's supposed to be THE system language on the planet.
|
|
|
|
|
Member 9167057 wrote: It's not just JS, there's other languages where the compiler just chugs along
Yeah, it's true. It's just this re-definition thing really leaves a mark.
Plus I'm very spoiled by VStudio and C#. It's quite good actually.
|
|
|
|
|
At my first employer as a very junior software engineer (though we called ourselves programmers back then - early 1990s), we used a variant of the PICK operating system called UniVERSE that ran on AIX.
Our code was mainly in PICK BASIC, which was a "business BASIC" variant.
With the version we were using, we'd sometimes run into bugs that would throw an error at runtime, but when you'd run it in the debugger (which was a nice step-wise debugger, with tons of nice features for the time), it would pass right by the line with the supposed error, and work just fine.
Then you'd exit the debugger, run the same piece of code - and it would work perfectly!
Think about that - it was a literal debugger!
Even so, it was hella annoying...
|
|
|
|
|
The heisenbug, a bug disappearing when being looked at. My own experience with such bugs boils down to mostly 2 situations:
1. Timing conditions, the debugger (by principle) slows code down. Solution: Introduce a Sleep(300).
2. Code design to behave differently under a debugger. I remember inheriting a piece of code written like that, cursing loud enough to get asked WTF is going on my several colleagues, throwing this piece of trash away and reimplementing the same functionality anew.
|
|
|
|
|
|
This is just a tooling problem. When writing Javascript, you always use a linter. (Even when writing Typescript, you can use Tslint)
Also: don't use var anymore, use const or let. And use a transpiler if you need to support old IE versions.
|
|
|
|
|
Jeroen_R wrote: Also: don't use var anymore, use const or let. And use a transpiler if you need to support old IE versions.
JavaScript and new rules for a an old JavaScript prototype builder.
Also, I don't want to support old IE.
It's dead, Jim!
|
|
|
|
|
raddevus wrote: It's only 1000 lines of code. (That's like 4 printed pages. Not bad.)
Only if you have VERY good eyes, because it would be printed in ... Courier New point 2
I'm guessing you actually mean 20 printed pages in Courier New point 9 (which is also not bad)
|
|
|
|
|
V. wrote: Only if you have VERY good eyes, because it would be printed in ... Courier New point 2
Hahaha! You are right. I was thinking 250 words per page.
I'm nuts!! 20 pages!! What's going on around here? Oh man, I got to go back and slim things down.
|
|
|
|
|
raddevus wrote: new room({location:i}) just sends in a json object which is used to initialize the object.
‘{location:i}’ is Javascript syntax for defining an object.
JSON is a format for persisting Javascript objects as text.
|
|
|
|
|
jarvisa wrote:
‘{location:i}’ is Javascript syntax for defining an object.
JSON is a format for persisting Javascript objects as text.
That's a very good (specific) point.
|
|
|
|
|
A poor craftsman blames his tools.
Javascript (or any language) is as good or bad as the developer using it. You can paint yourself in a corner using any language the only difference is the color of the paint!
Sorry guys, but tell me that ain't the truth.
If you think hiring a professional is expensive, wait until you hire an amateur! - Red Adair
|
|
|
|