1 只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。
2 每个作用域都会进行提升操作,名称标识符赋值之前也无法在所在作用域中使用
foo(); //TypeError bar(); //ReferenceError var foo=function bar(){...}
3 函数会首先被提升,然后才是变量。重复的声明会被忽略。但后面出现的函数声明是可以覆盖前面的。
foo(); //1 var foo; function foo(){ console.log(1); }; foo=function(){ console.log(2); }
4 一个普通块内部的函数声明通常会被提升到所在作用域的顶部。
foo(); //"c" foo被声明两次 后面的声明覆盖前面的声明 var a=true; if(a){ function foo(){console.log("b");}; }else{ function foo(){console.log("c");}; };
此行为不可靠,新版浏览器报错,因此应该避免在块内部声明函数