博客地址:http://mirroravatar.iteye.com/blog/2182793
出场白:
JavaScript Hoisting,即JavaScript声明提升,包括函数声明提升和变量声明提升。
正文部分:
- 声明的提升,是按作用域来提升的。比如说,函数中的一个变量声明是这样的:
function foo() { console.log(a);//undefined var a = 2; }
这里面的变量a只能提升到函数foo内部的最上方,提升不到foo函数外面的作用域当中,只能是这样的:function foo() { var a; console.log(a); a = 2; }
- 函数声明(Function delaration)能提升,但是函数表达式(Function expression)不能提升,例:
foo(); // not ReferenceError, but TypeError! var foo = function bar() { // ... };
- 遵循函数是“第一公民”(first class)的准则,函数声明提升优先于变量声明提升。直接上例子吧:
foo(); // 1 var foo; function foo() { console.log( 1 ); } foo = function() { console.log( 2 ); };
此例子中,控制台输出的是1,原因是,函数声明提升优先,可以将代码做如下的转换:function foo() { console.log( 1 ); } foo(); // 1 foo = function() { console.log( 2 ); };
值得注意的是var foo不见了,原因也是函数声明提升优先,导致var foo无效,所以var foo 此代码是不编译的。