(function(){
aa();
f2();
var f1 = function aa(){};
function f2(){
alert(1);
}
})();
// 按照代码的执行顺序从上往下而言,在执行到未定义函数时报错 aa()未定义( aa is not defined )报错后就此就会中断,后面代码不在执行
//var f1,function f2(){}; //hoisting,被隐式提升的声明
// 上面代码中函数声明f2被提升,所以在前面调用f2是没问题的。虽然变量f1也被提升,但f1提升后的值为undefined,其真正的初始值是在执行到函数表达式处被赋予的。所以只有声明是被提升的。
// var a = 1;
// function outer(){
// var b = 2;
// function inner(){
// var c = 4;
// console.log(a);
// }
// inner(); //调用inner函数
// }
// outer(); //调用rainman函数
//JavaScript的作用域链
//观察alert(a);这句代码。JavaScript首先在inner函数中查找是否定义了变量a,如果定义了则使用inner函数中的a变量;如果inner函数中没有定义a变量,JavaScript则会继续在onter函数中查找是否定义了a变量,在这段代码中outer函数体内没有定义a变量,则JavaScript引擎会继续向上(全局对象)查找是否定义了a;在全局对象中我们定义了a = 1,因此最终结果会弹出'1'。
//作用域链:JavaScript需要查询一个变量x时,首先会查找作用域链的第一个对象,如果以第一个对象没有定义x变量,JavaScript会继续查找有没有定义x变量,如果第二个对象没有定义则会继续查找,以此类推。
//上面的代码涉及到了三个作用域链对象,依次是:inner、outer、window。