Wtf JS?
-
So, I have to help rewriting our customer website, which involves getting my hands dirty on JavaScript. No script bashing here, the right tool for the right job and all. Deciding to involve the Revealing Module Pattern for my multi viewmodel per page scripting, I tried writing something like this:
$(document).ready
(
function()
{
tmg.model1 = (function()
{
// Private
var name = ko.observable("Model 1");// Public return { name: name }; })(); $("\[tmg\_ns='vm1'\]").each( function() { var domNode = $(this)\[0\]; ko.applyBindings(tmg.model1, domNode); } ); }
);
It didn't work... Debugging revealed that the name property was
undefined
. After several hours and a lot of :java:, I found the 'error'; When returning a JavaScript object, the curly brace must be on the same line as the return statement!!! Yes, 3 exclamation marks, see what you made me do JS?, and oh, I want my hours back."God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
-
So, I have to help rewriting our customer website, which involves getting my hands dirty on JavaScript. No script bashing here, the right tool for the right job and all. Deciding to involve the Revealing Module Pattern for my multi viewmodel per page scripting, I tried writing something like this:
$(document).ready
(
function()
{
tmg.model1 = (function()
{
// Private
var name = ko.observable("Model 1");// Public return { name: name }; })(); $("\[tmg\_ns='vm1'\]").each( function() { var domNode = $(this)\[0\]; ko.applyBindings(tmg.model1, domNode); } ); }
);
It didn't work... Debugging revealed that the name property was
undefined
. After several hours and a lot of :java:, I found the 'error'; When returning a JavaScript object, the curly brace must be on the same line as the return statement!!! Yes, 3 exclamation marks, see what you made me do JS?, and oh, I want my hours back."God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
-
So, I have to help rewriting our customer website, which involves getting my hands dirty on JavaScript. No script bashing here, the right tool for the right job and all. Deciding to involve the Revealing Module Pattern for my multi viewmodel per page scripting, I tried writing something like this:
$(document).ready
(
function()
{
tmg.model1 = (function()
{
// Private
var name = ko.observable("Model 1");// Public return { name: name }; })(); $("\[tmg\_ns='vm1'\]").each( function() { var domNode = $(this)\[0\]; ko.applyBindings(tmg.model1, domNode); } ); }
);
It didn't work... Debugging revealed that the name property was
undefined
. After several hours and a lot of :java:, I found the 'error'; When returning a JavaScript object, the curly brace must be on the same line as the return statement!!! Yes, 3 exclamation marks, see what you made me do JS?, and oh, I want my hours back."God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
Ah! The old semicolon-less syntax designed to help ex VB programmers. The newline after
return
marks the end of thereturn
statement and the following braced bit is ignored. It is not true that the{
has to be on the same line. A better format isvar result = { name: name };
return result;or, much easier, discard the function completely and just write
tmg.model1 = { name: ko.observable("Model 1") };
-
The real wtf is Javascript's optional semi colons, which is what's happening there. Using something like JSLint would have told you this:
{
name: name
};was unreachable code. But yeah, JS definitely has some... interesting pieces. :)
Heh, thanks. Allthough it's an interesting project, I just don't think I will learn to love JS.
"God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
-
Ah! The old semicolon-less syntax designed to help ex VB programmers. The newline after
return
marks the end of thereturn
statement and the following braced bit is ignored. It is not true that the{
has to be on the same line. A better format isvar result = { name: name };
return result;or, much easier, discard the function completely and just write
tmg.model1 = { name: ko.observable("Model 1") };
Thanks for clearing that up. Didn't make JS look any better to me though :) Weird architecture that, just because there is a structure doesn't mean that it's actually helpfull. I'm sure there is a special part of Hell reserved for script designers putting subtle twists to a product. I will certainly go for your first suggestion, the second wouldn't conform to the Revealing Module Pattern (or should that have been in all caps?).
"God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
-
Thanks for clearing that up. Didn't make JS look any better to me though :) Weird architecture that, just because there is a structure doesn't mean that it's actually helpfull. I'm sure there is a special part of Hell reserved for script designers putting subtle twists to a product. I will certainly go for your first suggestion, the second wouldn't conform to the Revealing Module Pattern (or should that have been in all caps?).
"God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr
-
So, I have to help rewriting our customer website, which involves getting my hands dirty on JavaScript. No script bashing here, the right tool for the right job and all. Deciding to involve the Revealing Module Pattern for my multi viewmodel per page scripting, I tried writing something like this:
$(document).ready
(
function()
{
tmg.model1 = (function()
{
// Private
var name = ko.observable("Model 1");// Public return { name: name }; })(); $("\[tmg\_ns='vm1'\]").each( function() { var domNode = $(this)\[0\]; ko.applyBindings(tmg.model1, domNode); } ); }
);
It didn't work... Debugging revealed that the name property was
undefined
. After several hours and a lot of :java:, I found the 'error'; When returning a JavaScript object, the curly brace must be on the same line as the return statement!!! Yes, 3 exclamation marks, see what you made me do JS?, and oh, I want my hours back."God doesn't play dice" - Albert Einstein "God not only plays dice, He sometimes throws the dices where they cannot be seen" - Niels Bohr