Javascript笔记《一》之解析与执行

来源:互联网 发布:ios 监控软件 编辑:程序博客网 时间:2024/06/05 05:07

JavaScript是一门运行在浏览器端解释执行的脚本语言。 其与一般的解释型语言(如shell)不同的是js并不像shell等脚本语言那样解释一行,执行一行; 而是分为预处理与执行二个阶段。

为了方便理解,预处理和执行阶段我们分为全局与函数分别介绍:

全局预处理阶段:
js引擎会创建一个全局的词法环境对象LexicalEnv, 同时扫描整个Js文件把用var声明的变量及用声明的方式创建的函数初始化为LexcialEnv的一个成员。

LexicalEnv{    变量名:  undefined,    函数名: 指向函数的引用}

全局的LexicalEnv其实就是window对象。

在这里有几个概念需说明一下:
函数创建的方式主要有4中:
a、声明的方式:function f(){}
b、函数表达式:var f = function(){}或var f = function xx(){}
c、new Function()方式: var f = new Function(“参数列表”,”函数体”);
d、匿名函数

在javacript中不存在块作用域,js引擎扫描时,会忽略全局的if、for。
如以下JS代码:

<script type="text/javascript">            console.log(a);             console.log(b);             console.log(c);             console.log(d);            console.log(e);            console.log(i);            console.log(f);            console.log(g);            var a = 10;            b = 5;            function f()            {                var e = 20;                console.log('f');            }            var g = function()            {                console.log(g);            }            if(false){                var d  = 20;            }else{                c = 5;            }            for(var i = 0; i < 10; i++){}</script>

以上代码输出结果:
实际上以上代码是不能运行的,必须把console.log(b)及console.log(c)、console.log(e)这3行必须注释掉程序才能运行。这很好理解,因为变量b、c并未用var声明,而e是在函数f的内部定义的,根据前面的知识, 全局的词法环境对象中不会存在这3个变量,所以会报“is not defined”错误。

console.log(a)、console.log(d)、console.log(i)、console.log(g) 输出“undefined”;
console.log(f)输出:function f(){var e = 20; console.log(‘f’)}。

根据以上代码测试结果,可以分析得出预处理阶段的词法环境对象初始化过程:

LexicalEnv{    a:undefined,    d:undefined,    i:undefined,    g:undefined,    f:指向函数的引用}

全局执行阶段:
执行阶段会给变量赋值,及函数调用。
注意:如果变量未用var声明(包括函数内),执行时会把该变量加入到全局词法环境对象中,并初始化。

执行之后,全局词法环境对象为:

LexicalEnv{    a:10,    b:5,    c:5,    d:undefined,    f:执行函数的引用,    g:执行函数的引用,    i:10}

函数预处理阶段:
1、函数每调用一次,就会产生一个LexicalEnv对象
2、函数中的参数会加入到词法对象中,并初始化实际参数的值
3、函数内部声明式函数
4、函数内部var定义的变量
与全局预处理阶段不同的是,多了1、2步骤。

我们来看下如下代码:

function f(a, b){alert(a);alert(b); alert(c); alert(d);var c = 20;function d(){}}f(1,2);

输出结果:
a的值为1, b的值为2, c的值为undefined, d的值为函数的引用。
在函数f被调用时,会创建一个词法对象LexicalEnv,而且是每调用一次,就会创建一个。

LexicalEnv{    a:1,    b:2,    c:undefined,    d:指向函数的引用}

函数执行阶段:与全局执行阶段一样。

注意:如果变量未用var声明,执行时会把该变量加入到全局词法环境对象中,并初始化。

0 0