Дело в hoisting. Присваивание значений не поднимается вместе с объявлением переменных.
Ваш код аналогичен следующему:
var p = 'val';
(function () {
var name; // undefined
if (typeof name === 'undefined') {
console.log(name);
name = "newVal";
console.log(name);
} else {
console.log(name);
}
})();// newVal