问题
在其他编程语言中,都规定必须先声明再使用,例如:
var a = 10; // 声明
alert(a); // 调用
但在JS中,我们发现,如下:
alert(a); // 使用变量
fn(); // 调用fn函数
var a = 10; // 声明
function fn(){}
为什么可以 先使用后声明 呢?
主要因为是JS解析与执行过程中的 **预处理**
分类
JS解析与执行过程分成2部分
1、全局 (JS一开始解析与执行的地方)
2、函数 (函数调用才开始解析与执行)
全局
全局JS代码执行分为2个阶段 (JS一开始就执行以下2个阶段)
1. 预处理阶段
2. 执行阶段
预处理主要处理以下2种代码
1、全局中的函数声明
2、全局中的用var声明的变量
###################### 处理前
alert(a); //undefined
fn();
alert(b); //报错,b不是预处理的代码
var a = 10;
b = 123;
function fn(){}
###################### 处理后
function fn(){}
var a;
alert(a); //undefined
fn();
alert(b); //报错,b不是预处理的代码
a = 10;
b = 123;
从上面可以看出,为什么JS可以在声明前调用了,还有一点很重要是:预处理的处理顺序:先处理函数,再处理var变量
函数
函数体内JS代码执行分为2个阶段 (函数调用时,执行以下2个阶段)
1. 预处理阶段
2. 执行阶段
预处理主要处理以下3种代码
1、函数参数
2、函数中的函数声明
3、函数中的用var声明的变量
函数体内预处理的处理顺序:先处理函数参数,再到函数,最后处理var变量
###################### 处理前
function go(a, b){
alert(a)
test();
var aa = 10;
function test(){}
}
go(1, true)
###################### 处理后
function go(a, b){
function test(){}
var aa;
alert(aa) // undefined
alert(a) // 1
test();
aa = 10;
}
go(1, true)
命名冲突
- 如果一个var变量名与一个函数名相同,那么函数优先
- 如果一个var变量名与另外一个var变量名相同,那么以第一个为准
- 如果函数内参数名与函数名相同,以函数优选
- 如果函数内参数名与一个var变量相同名称,参数是第一个所以参数优先
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。