一、编译阶段
变量提升:
是指的JavaScript代码执行过程中,JavaScript引擎会把变量的定义和函数的声明部分提升到代码开头的位置。变量提升以后,会给变量赋值undefined,函数则会完整的声明。
变量提升意味着变量和函数的声明会在物理层面上移动到代码的最前面。但是这不是准确的,实际上,函数的声明和变量的声明的位置是不会改变的,而是编译阶段,JavaScript引擎会把他们放到内存中。换句话说,JavaScript代码在执行前是需要被编译的,编译完成以后才会进行执行阶段。
总结下,JavaScript代码执行有两个阶段:编译阶段和执行阶段
简单的说,变量提升是在JavaScript代码的编译阶段。一段代码经过编译以后,会分成两部分,
执行上下文和可执行代码。
执行上下文是JavaScript执行代码是的环境,比如调用一个函数,就会在进入这个函数的执行上下文,确定该函数在执行期间的this,变量,对象等。在执行上下中存在一个环境变量的对象(Viriable Environment),这个对象保存了变量提升的内容。
二、执行阶段
执行阶段,JavaScript引擎开始执行“可执行代码”,
1)当执行到showName()函数的时候,从环境对象里面,拿到showName()函数执行
2)接下来打印myname,JavaScript引擎继续在环境对象里面查找该对象。很巧环境对象存在myname这个对象,并且在代码编译阶段给他赋值了undefined,所以打印内容就是undefined。
3)这个时候出现了一个赋值操作,把“极客时间”赋值给了myname,赋值以后,环境对象里面的myname属性值就变成了极客时间
三、代码中出现相同的变量或者函数怎么办?
1)编译阶段
遇到了第一个showName函数,会把函数showName放到环境对象里面,然后是第二个showName,继续存到环境对象里面。但是环境对象里面已经有了一个showName,这时候,第二个存入环境对象的showName会把第一个给覆盖掉。环境变量就只会存在最后一个存入环境对象的同名函数。
2)执行阶段
先执行第一个showName函数,这时候JavaScript引擎会从环境对象里面找到showName这个函数,然后执行,这时候存的showName函数是编译阶段最后存入的,所以会打印“极客时间”。第二次调用showName也是一样的流程
总结:
1)JavaScript代码执行过程中,首先会做的就是变量提升,这是因为JavaScript代码执行的流程决定的,JavaScript代码在执行过程中分为:编译阶段和执行阶段.在编译阶段:变量和函数会被放到环境对象里面,变量会被赋值为undefined;在代码执行阶段,JavaScript引擎会从环境对象里面取出变量和函数.
2)在编译阶段,存在两个相同的函数,呢么存入环境变量的会是最后一个,后定义的会覆盖掉前面的,