They don't mean the same thing. One gives the name var_ the type bool and the other gives it the type MyJNash.

The static function that is confusing you probably should look like
Code:
static bool &JohnFunc()
without the MyJNash typename in there. Now if you are curious why the & seems "attached" to the function name, instead of the return type, it is because it doesn't matter. Some people write
Code:
ReturnType *someFunction()
where others would write
Code:
ReturnType* someFunction()
Sometimes the reasoning is based on the duality between pointer type and dereferencing. For example, one could then write
Code:
ReturnType myObject = *someFunction();
and someone else could write
Code:
ReturnType *myPointer = someFunction();
depending on whether or not someone wanted ownership of the object lifetime or not and whether / not to copy, etc. And the same types that might put the pointer on the name could put the reference there for symmetry, even though you don't quite have the same duality.