JavaScript 词法分析
JavaScript 引擎在代码执行前会进行词法分析,词法分析主要有三个步骤:
分析参数 -> 分析变量的声明 -> 分析函数声明
词法分析过程
JavaScript 函数在运行的瞬间,会生成一个活动对象 AO(Active Object),举个例子
1 | function f1(name){ |
第一步:分析参数:
- 函数接收形式参数,添加到 AO 的属性,并且这个时候值为
undefined
, 即AO.name=undefined
- 接收实参
"abc"
,添加到 AO 的属性,覆盖之前的undefined
,即AO.name='abc'
第二步:分析变量声明: 如 var name;
或 var name='mary'
;
- 如果上一步分析参数中 AO 还没有 name 属性,则添加 AO 属性为
undefined
,即AO.name=undefined
- 如果 AO 上面已经有 name 属性了,则不作任何修改,此时
AO.name==='mary'
第三步:分析函数的声明:
如果有 function name (){}
把函数赋给 AO.name
, 覆盖上一步分析的值
实例
分析下面这个栗子:
1 | var a = 10; |
第一步,分析函数参数:
1 | AO.a = undefined // 形式参数 |
第二步,分析局部变量:
1 | 第 4 行代码有 var a, 但是此时已有 AO.a = 100, 所以不做任何修改,即 AO.a = 100 |
第三步,分析函数声明:
1 | 第 6 行代码有函数 a, 则将 function a (){} 赋给 AO.a, 即 AO.a = function a (){} |
执行代码时:
1 | 第 3 行代码运行时拿到的 a 时词法分析后的 AO.a,即 AO.a = function a (){}; |
ps:
1 | 1.var a = 10; |
ps:
1 | var a = 10; |
ps:(执行结果同上)
1 | var a = 10; |
补充说明:函数声明与函数表达式
1 | // 函数声明 |
a 和 b 在词法分析时,区别:
1 | a 在词法分析时,就发挥作用; |
词法作用域
词法作用域的意思是,作用域为在定义时 (词法分析时) 就确定下来的,而并非在执行时确定。即在函数未执行前,函数执行的顺序已经被确定,而不是类似 JAVA 一样,是在执行前根本不知道执行顺序。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Serendipity!
评论