You still haven't got an answer so:
var bill = bill || [];
is interpreted exactly as if it had been written:
var bill;
bill = bill || [];
Note that because the reference to bill is after its declaration, there's no exception. It's undefined of course so it'll be set to the empty array.
If another file had been included, then if bill is already a property of the global object then the var does nothing. In particular, the value of the existing global is not affected by the var declaration. The assignment would stick with any non-falsy value.
There are situations where this can happen in a local context. Some build-time code preprocessors may combine separate fragments into a wrapper function. In such cases, the same behavior would happen except that there aren't any global variables involved. Furthermore, if the intention is explicitly to create a global, then you'd probably want
window.bill = window.bill || [];
just to make things unambiguous.