Property resolution is fundamentally different to identifier resolution. The trivial answer is that ECMA-262 specifies that attempting to read a non–existent variable will throw an error, while attempting to read a non–existent object property does not, it just returns the special undefined value.
To get the reason, you'll need to aks Brendan Eich, who first developed JavaScript, on which ECMA-262 is based. However, a reasonable guess is that Brendan wanted to make JavaScript a simple language with loose typing, so rather than having to do something like:
if ( 'foo' in obj) {
/* do something with obj.foo */
}
every time you want to access a property for the first time, the language was made tolerant of attempts to access undefined properties.
On the other hand, applying the same approach to variables would have created more issues than is solves, so typeof can be used to see if an identifier exists:
if (typeof foo != 'undefined') {
/* ok to use foo */
}
Otherwise, property and identifier resolution are quite similar. The difference is that the first proceeds from an object, along a string of internal [[Prototype]] objects (the inheritance chain) and finally to the null object, whereas variable resolution proceeds from the local variable object along a string of similar objects belonging to outer contexts (the scope chain) to the global object.
undefinedis a value rather than an object.