Just like Python, JavaScript tends to create things once you mention them and they don’t yet exist. In my opinion, that’s a bit more harmful than useful, because there’s danger in accidentally creating new variables and values when you assumed it would be already holding a known value. Coming from a C/C++/Java background, I would expect some kind of error for the operation:
<html> <body onload="testFunction()"> <div id="content"></div> <script> function testFunction() { function Test() { var somevar=1; }; var test = new Test(); test.somevar += 10; document.getElementById("content").innerHTML = ""+test.somevar; } </script> </body> </html>
In this context, somevar might not exist yet, and still, you’re adding 10 to its value! By printing it is possible to check that this var is a NaN, and no errors are issued. To properly (as I eventually found out by trying) get and set its value, one must create getter and setter functions, to “publicly interface” in other contexts:
<html> <body onload="testFunction()"> <div id="content"></div> <script> function testFunction() { function Test() { var somevar=1; this.getSomevar = function() { return somevar; }; this.setSomevar = function(value) { somevar = value; }; }; var test = new Test(); test.setSomevar(test.getSomevar() + 10); document.getElementById("content").innerHTML = ""+test.getSomevar(); } </script> </body> </html>
But hey, be careful when using “this”, its context is related to the current function, not the “class”, as one would think coming from a Java mindset. Using “this” inside class functions can cause undesired effects, such as defining new variables inside the “method” context and again we’ll run into the NaN problem:
<html> <body onload="testFunction()"> <div id="content"></div> <script> function testFunction() { function Test() { var somevar=1; this.getSomevar = function() { return this.somevar; }; this.setSomevar = function(value) { this.somevar = value; }; }; var test = new Test(); test.setSomevar(test.getSomevar() + 10); document.getElementById("content").innerHTML = ""+test.getSomevar(); } </script> </body> </html>
Pushed some updates to the game on github. 🙂