js 做用域

考虑如下代码:
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

“重复”声明的代码中)是函数会首先被提高,而后才是变量。变量

相关文章
相关标签/搜索