考虑如下代码: a = 2; var a; console.log( a ); 你认为console.log(..) 声明会输出什么呢?
----->2java
考虑另一段代码: console.log( a ); var a = 2; 鉴于上一个代码片断所表现出来的某种非自上而下的行为特色,你可能会认为这个代码片 段也会有一样的行为而输出2。还有人可能会认为,因为变量a 在使用前没有先进行声明, 所以会抛出ReferenceError 异常。 不幸的是两种猜想都是不对的。输出来的会是undefined。
解析:
函数
引擎会code
在解释JavaScript 代码以前首先对其进行编译(虽然js是动态语言,可是js引擎仍是会编译js代码);ip
编译阶段中的一部分工做就是找到全部的声明,并用合适的做用域将它们关联起来作用域
咱们的第二个代码片断实际是按照如下流程处理的: var a; console.log( a ); a = 2;
所以,打个比方,这个过程就好像变量和函数声明从它们在代码中出现的位置被“移动”console
到了最上面。这个过程就叫做提高。编译
函数声明和变量声明都会被提高。可是一个值得注意的细节(这个细节能够出如今有多个class
“重复”声明的代码中)是函数会首先被提高,而后才是变量。变量