JavaScript是一种描述型的脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行。

代码并非由解析器直接逐行执行,所以理解javaScript语言的运行机制,掌握javascript的执行顺序,有利于我们学好JavaScript。

预处理(预编译)阶段:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描代码中的用声明的方式声明的函数,和var定义的变量,并将它们加到预处理阶段的LE中去。

比如下面这段代码:

1
2
3
4
5
6
7
var a = 10;(var定义的变量)

function b( ){

console.log('这是一个声明方式声明的函数')

}

解析器在对代码进行预处理时,在全局LE中添加了如下内容:

1
2
3
4
5
6
7
8
9
LE{

a = undefinded;

function b( ){

console.log('这是一个声明方式声明的函数')

}

注意:在预处理阶段,以赋值方式创建的函数不会被添加到LE中去,而是将变量添加到LE,且值为undefinded。待代码执行上下文时才对该变量赋值(匿名函数)

比如:

1
2
3
console.log(a);

var a = function( ){ }

其结果为 undefinded;

说明:全局预处理阶段在代码执行阶段前完成,并将代码中声明的变量 和 声明方式创建的函数加入全局的LE中(或等价于window) ,其中的变量即为全局变量。同时也解释了声明函数可在任意位置调用,而以表达式创建的函数(如构造函数的原型方法)必须在调用前声明。

我们还可以通过在浏览器的控制台中输入window. + “变量名”的方式确认该变量。

1
2
3
4
5
6
7
var a;

function b( ){

console.log(‘这是一个声明方式声明的函数’)

}

下面我们来做一个练习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
console.log(a);

console.log(b);

console.log(c);

console.log(d);

var a = 10;

b = 15;

function c( ){

};

var d = function( ){

};

在预处理阶段做了这些事:

1
2
3
4
5
6
7
8
9
10
11
LE{

a = undefinded;

b没有被添加到LE中,所以这行会报错 b is not definded

指向函数

d不是声明方式创建的函数,所以d = undefinded

}

结果为:

1
2
3
4
5
6
7
8
9
undefinded

报错

function c( ){

}

undefinded

最后更新: 2018年01月14日 22:05

× 感谢支持
打赏二维码