Great question Logan.
When using the console, our interaction with Node is done with a REPL, which stands for Read - Evaluate - Print - Loop. The "Print" portion is the key here. In the REPL interface, it prints the output of whatever you give it and in cases where there is no output, the output is
undefined. In the second example, welcomeMsg is called from the start function. The start function doesn't get a return value back, and isn't expecting one because it just executes the function. Had we done something different like
var foo = callback;
it would have printed
undefined as you were expecting.
Another way of stating that might be to say that the REPL interface is tied to the start function. So, it
Reads the start function,
Evaluates it (or executes it),
Prints whatever it got back, then
Loops back to the cursor waiting for you to tell it what to do next. Everything that happened within the
start function was done inside of Node, and only its return values were available to the REPL.
Hope that makes sense, if not- please let me know!