Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
$.answer=42 (google-analytics.com)
60 points by adamnemecek on April 12, 2014 | hide | past | favorite | 25 comments


It's tricky to tell exactly what's happening because the code is obfuscated through compilation, but as best I can tell, it's using the `answer` value to prevent another global from making it seem like the Analytics code has already been initialized.

There is a JavaScript object representing all of the Google Analytics state and functions. When this object is set up, they add the property "answer = 42" to it. Then, before making this object globally accessible at `window.ga`, they double check that `window.ga` does not yet exist or that `window.ga.answer` does not equal 42. If it already equals 42, then the initialization must have already happened (maybe the Analytics code was included twice?), and so it doesn't proceed to clobber that already-initialized global Analytics state. Checking that the `window.ga` variable doesn't exist is not quite enough, since other JavaScript on the page may have set that property for some reason (of course, this logic wouldn't work if other code on the page had simple set `window.ga.answer = 42`, but that's unlikely to happen by accident). As long as it looks like the initialization hasn't already run, then it goes ahead and does the initialization and makes the result globally accessible at that point.

tl;dr: It's not just a joke; it's actually used to make it less likely that other JavaScript on the page hasn't created a global variable called `ga` which may otherwise prevent the Analytics code from running.


Here's an useful website if you want to make the code more readable: http://jsbeautifier.org/


Chrome also has a button[0] to do this automatically in the Developer Tools, which is what I used when I wrote the initial comment.

[0]: https://developers.google.com/chrome-developer-tools/docs/ja...


It's been a few decades.. Maybe time for some new community jokes?


Agreed...


$ is what? [1]

[1] For those not in on the joke: http://en.wikipedia.org/wiki/42_(number)#The_Hitchhiker.27s_...


An identifier must start with $, _, or any character in the Unicode categories “Uppercase letter (Lu)”, “Lowercase letter (Ll)”, “Titlecase letter (Lt)”, “Modifier letter (Lm)”, “Other letter (Lo)”, or “Letter number (Nl)”.

From: http://stackoverflow.com/questions/1661197/valid-characters-...


var $=function(a){J(1);Z.D[G](Z,[arguments])};

$ is a function object.

$.answer is a property of that object.

$ itself doesn't really mean anything special in javascript.

jQuery and other libraries often use $ as their main object, so it's probably best to avoid using it unless you need to or it's wrapped in another function.


The only thing I've learned in the years that I've been writing Javascript is that the dollar symbol variable is as contentious as the West Bank. Obviously there has to be globals somewhere or else a library ceases to be a library in JS, but I see no problem is using the word jQuery explicitly, or simply passing it into a SEAN/IIFE:

  (function($) {
     $('#thing').hide();
  })(jQuery);


Yes, that's how you write a jQuery module. That's how I do it:

    (function($,undefined) {
        "use strict";
        ...
    })(jQuery);
Note the undefined. That's because undefined is not a literal but a variable in JavaScript and can be assigned to anything. This way I ensure that undefined is really undefined and "x === undefined" works. But I digress.


It has nothing to do with jQuery, or anything else. (function() {})(); is a pretty standard Javascript pattern to execute an anonymous function immediately at evaluation. Because javascript has lexical scoping at the function, your use of "use strict"; and any var-prepended variables won't be hoisted up the prototype chain, potentially becoming globals. The ability to pass in a global as a local variable is simply a convenience. The global is available inside the closure anyways. It's a global after all.

My point was, the battle over the dollar sign single character variable name is stupid.


About `undefined`, that’s not true anymore in ES5, btw.


6*9


Slightly OT: What is the background for allowing $ to be used in ECMAScript identifiers? I imagine there could be some compatibility background.


Nice finding ! And it's so true ! 42 is the answer to everything ;)

Even to check an instantiation ...

    $.answer = 42;
[...]

    $.N = function () {
    
        var a = O[gb];
    
        if (!a || 42 != a.answer) {
[...]

            O[gb] = $;
[...]

        }
    
    };
    
    $.N();


42 is the answer to everything

That's not really what the Hitchhikers Guide to the Galaxy said - rather, 42 is the answer to the ultimate question of life, the universe and everything. But since we don't know what the question is... Very different from the answer to everything.



Is it just me, or is their analytics JS file down?


Like you I got a 404. Then I remembered I blacklist this adress in /etc/hosts :

0.0.0.0 google-analytics.com

Maybe you forgot you do too ?


Maybe a little off topic, but what's the purpose for that? Does it make websites that use google analytics unable to track your visit?


Everytime you visit a GA enabled site, it sends back some information to the Google servers including url, referrer, time spent etc. Google can use this build up a history of websites you (this is not linked to your Google account, more like an unique id) frequent and show targeted advertisements.


Yeah, I do. How forgetful of me. Thanks!


How does lack of IP turn into a 404?


If you are running a web server on your own computer that does not have a resource at that URI. 0.0.0.0 is a magic number that means any local network interface.


Maybe you have a plugin blocking it.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: