Ваш взгляд на подъем неверен.Когда вы не объявляете переменную с var
, она становится глобальной переменной, когда встречается .Там нет подъема переменной.Поэтому, если вы никогда не вызовете test
, переменная не будет определена в глобальной области видимости.
function test() {
try {
console.log("inside try", foo);
} catch (e) {
console.log("nope inside try: ", e.message);
}
console.log("test before", typeof foo)
foo = "bar";
console.log("test after", typeof foo)
}
console.log('outside before called: ', typeof foo);
console.log('does not exist example: ', typeof bar);
try {
console.log("outside try", foo);
} catch (e) {
console.log("nope outside try: ", e.message);
}
test();
console.log('outside after called: ', typeof foo);
Теперь, если вы использовали var для объявления переменной, она будет поднята, если вы попытаетесь использовать ее до ее объявления.
function test() {
// var foo; <-- it is hoisted to here
try {
console.log("inside try", foo);
} catch (e) {
console.log("nope inside try: ", e.message);
}
console.log("test before", typeof foo)
var foo = "bar"; // line here acts like foo="bar" since declared at top with hoisting.
console.log("test after", typeof foo)
}
console.log('outside before called: ', typeof foo);
console.log('does not exist example: ', typeof bar);
try {
console.log("outside try", foo);
} catch (e) {
console.log("nope outside try: ", e.message);
}
test();
console.log('outside after called: ', typeof foo);