JavaScript解析器

执行js代码一般分两步:1.预解析代码。 2.逐行执行代码。
当解析器进入执行环境时,变量对象就会添加执行环境中声明的变量和函数作为它的属性,这就意味着变量和函数在声明之前已经可用,变量值为undefined,这就是变量和函数声明提升(Hoisting)的原因,与此同时作用域链和this确定,此过程为解析阶段,俗称预解析。接着解析器开始执行代码,为变量添加相应值的引用,得到执行结果,此过程为执行阶段。
举个例子:

var a=1;
var b=2;
function c(){
  alert('hello');
}

预解析代码呢,主要会把var , function , 参数等一些东西 存储进仓库里面(内存)。
1.var 一般用于声明变量,预解析代码的时候,等号后面的赋值过程不会执行,所以预解析时的var 变量 都是未定义的。
2,.function 函数呢,预解析的时候,值就是函数里面的内容。

当变量和函数重名时:就只留下函数的值,不管顺序谁前谁后。所以函数的优先级比变量高。注意:这只是预解析。
当函数和函数重名时:会留下后面那个,会遵循上下文机制。

JavaScript解析器_第1张图片

我们来分析一下:
第一步:预解析
上面说过,预解析时只会把var , function ,参数等存储起来,所以:
执行到第1行时,a 的值是未定义。
执行到第2行时,b 的值是未定义。
执行到第3行时,c 的值是函数本身,也就是function c(){alert('hello');}。
第二步:代码逐行执行
预解析完成之后,就是代码逐行执行了
第1行,a被赋予值1
第2行,b被赋予值2
第3行,只是函数的声明,还未调用函数。

举个变量和函数重名的例子:


你可能感兴趣的:(JavaScript解析器)