提升hoisting
##变量提升 一个变量只属于一个作用域, 通过var声明的变量会发生变量提升。
function(){ foo = 1; var foo; console.log(foo); // output:1}复制代码
注意只有变量声明被提升了,赋值语句没有。
function(){ foo = 1; var foo = 2;}等价于function(){ var foo; foo = 1; foo = 2;}下例中因为有变量提升所以foo不是gobal。function(){ console.log(foo); foo = 1; console.log(foo); var foo = 2; console.log(foo);}// output: undefined 1 2复制代码
另一个例子解释了为什么通过 var fnSomeFunction = function(){};不会发生函数提升。
console.log(fnSomeFunction);//output: undefined'fnSomeFunction(); // output: error fnSomeFunction is not a functionvar fnSomeFunction = function(){ console.log("i am here");}//fnSomeFunction 终究是变量,所以提升到最顶。至使在赋值语句之前无法调用函数。复制代码
函数提升
通过常规函数声明可发生函数提升,且包括定义部分。
foo();//output: i am herefunction foo(){console.log('i am here');}复制代码
需要特别提醒,函数提升早于变量提升,但是var不会覆盖同名函数。
console.log(typeof foo); //output: functionvar foo = 1;console.log(typeof foo); //output:numberfunction foo(){console.log('i am here');}//等价于function foo(){console.log('i am here');var fooconsole.log(typeof foo); //output: functionfoo = 1;console.log(typeof foo); //output:number}复制代码