JavaScript是一种描述型的脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行。
代码并非由解析器直接逐行执行,所以理解javaScript语言的运行机制,掌握javascript的执行顺序,有利于我们学好JavaScript。
预处理(预编译)阶段:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描代码中的用声明的方式声明的函数,和var定义的变量,并将它们加到预处理阶段的LE中去。
比如下面这段代码:
1 | var a = 10;(var定义的变量) |
解析器在对代码进行预处理时,在全局LE中添加了如下内容:
1 | LE{ |
注意:在预处理阶段,以赋值方式创建的函数不会被添加到LE中去,而是将变量添加到LE,且值为undefinded。待代码执行上下文时才对该变量赋值(匿名函数)
比如:
1 | console.log(a); |
其结果为 undefinded;
说明:全局预处理阶段在代码执行阶段前完成,并将代码中声明的变量 和 声明方式创建的函数加入全局的LE中(或等价于window) ,其中的变量即为全局变量。同时也解释了声明函数可在任意位置调用,而以表达式创建的函数(如构造函数的原型方法)必须在调用前声明。
我们还可以通过在浏览器的控制台中输入window. + “变量名”的方式确认该变量。
1 | var a; |
下面我们来做一个练习:
1 | console.log(a); |
在预处理阶段做了这些事:
1 | LE{ |
结果为:
1 | undefinded |
最后更新: 2018年01月14日 22:05