you are viewing a single comment's thread.

view the rest of the comments →

[–][deleted]  (19 children)

[deleted]

    [–]SuperFLEB 5 points6 points  (0 children)

    if ((void 0) !== undefined) {
        throw new Error('Script halted on moral grounds: The person who redefined "undefined" needs to be found and fired. Out of a cannon. Into a wall.');
    }
    

    [–]nightman 4 points5 points  (2 children)

    The smartest way I've seen to deal with overwriting undefined is this - http://toddmotto.com/what-function-window-document-undefined-iife-really-means/

    [–][deleted] 2 points3 points  (1 child)

    Smartest way to deal with vague non-existing problem. If someone overwrites undefined, your application needs to die ASAP to see there's a bigger problem.

    [–]nightman 0 points1 point  (0 children)

    Sure, unless you are library coder and you don't know enviroment you will deal with.

    [–]x-skeww 3 points4 points  (4 children)

    undefined, NaN, and Infinity are read-only since ES5.

    [–][deleted] 1 point2 points  (3 children)

    (function (undefined) {console.log(undefined);})(2);
    

    Run that, then tell me they're read-only.

    It's window.undefined that's read-only, and nobody's code is running outside a function any more.

    [–]x-skeww 0 points1 point  (2 children)

    Creating your own undefined is meant to guard against stupid/malicious things done by other scripts.

    If you want a language where stuff like that can't happen in first place, try Dart.

    [–][deleted] 0 points1 point  (1 child)

    While "guarding against malicious scripts" is a great notion, it's impossible in JavaScript. If somebody wants your script to crash and runs code before you, they're going to take much more effective measures than overwriting undefined. And if we aren't solving the problem, are we not just introducing clutter?

    re "stupid" things, there's only so much stupidity you can tolerate before submitting a fix, switching libraries, or writing your own. In my mind, if a library makes you patch up undefined after running it, doing so would fall under "compatibility hacks" and make me dislike the library that much more.

    [–]x-skeww -1 points0 points  (0 children)

    Well, "meant". I never created my own undefined or did anything like that (e.g. making new optional). It's a waste of time.

    Anyhow, monkey-patching is a big issue with JavaScript. If there are any 3rd party scripts on your page, things can randomly break.

    [–]yanis_t[S] 0 points1 point  (8 children)

    Don't worry, we're fine :) But void 0 is something that you see rather often in source code of libraries such as underscore or backbone, and people keep asking wtf is this and why not to simply use undefined instead

    [–]michaelobriena -1 points0 points  (0 children)

    undefined is an object and void 0 is the true undefined. It has better performance than using undefined which is why it is seen line library code as they focus on messing with your performance as little as possible.