// 1
function foo() {
var num = 123;
console.log(num); //
}
foo();
console.log(num); //
变量提升后:
function foo(){
var num;
num = 123;
console.log(num); =>123
}
foo();
console.log(num);//先去当前作用域里面找,看有没有声明;因为是全局环境下,所以没有找到num,程序会报错
// 2
var scope = "global";
function foo() {
console.log(scope); //
var scope = "local";
console.log(scope); //
}
foo();
变量提升后:
var scope;
scope = "global";
function foo(){
var scope;
console.log(scope); =>先去当前作用域找变量的声明,如果没有则向上一级找,本例中,当前作用域中有声明,但是在该位置没有赋值,所以输出undefined
scope = "local";
console.log(scope); =>先去当前作用域找变量的声明,如果没有则向上一级找,有声明,并且有赋值,所以输出local
}
foo();
// 3
// 声明的变量都作为 window 全局对象的属性存在!
if("a" in window){
var a = 10; =>因为这里并不是一个作用域,所以变量会向上提升至全局环境,
}
alert(a); // ?
变量提升后
var a ;
if(‘a‘ in window){
a = 10;
}
alert(a); =>10;
if(!"a" in window){
var a = 10;
}
alert(a); // ?
// 4
var foo = 1;
function bar() {
if(!foo) {
var foo = 10;
}
alert(foo); //
}
bar();
变量提升后
var foo;
foo = 1;
function bar(){
var foo;
if(!foo){ =>foo声明未赋值,为undefined,隐式转换为false ,经过非运算符之后为true
foo = 10;
}
console.log(foo); =>因为上面条件为真,程序进入判断语句中,foo为10;所以最后输出10
}
bar();