5 ms·
One of my favourite ways to punish JavaScript developers who don't use `var` is to randomly hide a if (false) { var GLOBALVAR; } somewhere in th
by chewxy 13y ago
One of my favourite ways to punish JavaScript developers who don't use `var` is to randomly hide a
if (false) {
var GLOBALVAR;
}
somewhere in the code.
It's fun (in a harmless fun kinda way, but you can also use some really dirty tricks to really hamper someone's work) to fuck up people's code - that's why I wrote Underhanded JavaScript. :P
EDIT:
Another fun one is to add `return`s to constructor functions.
- danielweber 13y agoI haven't had my morning coffee; can you explain what this breaks? I know JavaScript's scoping rules are unusual.
- brianchu 13y agoI'm not too sure either. In JS, block scoping does not exist. There are only function scopes, so the var declaration gets hoisted out of the if block (but the assignment occurs in the if block - so the assignment doesn't happen).
- chewxy 13y agoOh you can definitely fake block scoping in JavaScript, with ES5. ;P
- chewxy 13y agoImagine you have inexperienced coders who do this: function foo() { bar = function(){}; //define bar } function baz() { bar(); // use bar } Note that both foo() and baz() could themselves, be inside another function. Doesn't really matter. Now `bar` is a defined as a a property of the global object. If you add if (false) { var bar; } in baz(), most developers, as I had noticed, will ignore it - afterall, it's a false condition, the code will never enter that branch. But because variables are "hoisted", you have now declared `bar`, it's lexically scoped as a new variable under `baz()`, with the value `undefined`. So, when `bar()` gets called, it becomes an error, because `undefined` is not a function definition. ... and yes, dear JavaScript developers, despite all the good efforts of people like Nicholas Zakas, Douglas Crockford, Addy Osmani and the like, bad JavaScript still exists in the wild. And I feel, in greater numbers than ever, and I am not optimistic that the amount of bad JavaScript will be ever reduced. This depresses me. Can't be helped, I guess.
- zupa-hu 13y agoIt is only harmful if the developer actually used the variable as a side effect, aka relied on it outside the current scope. By making the global variable local to the scope around the if statement, side-effects won't escape the local scope (as said, the if block does not declare a new scope).
- watwut 13y agoHow is either of those fun? I see why revere console logs are funny, if done when there is no time pressure and a lot of time available. I do not want to work in environment where people feel that it is appropriate to routinely "punish" colleges by making them waste time like this.
- chewxy 13y agoYou could argue that "use strict" does the same, except it's language mandated. But yes, you have a point. These are not particularly fun, if you are on the receiving end. I've seen more than enough hair-raising bad JavaScript to last me a lifetime. But you gotta admit, if you're on the pranking end, it could be fun to see someone tear their hair out. Or my sense of humour is way out of whack. probably the latter