1

问题

在其他编程语言中,都规定必须先声明再使用,例如:

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)

命名冲突

  1. 如果一个var变量名与一个函数名相同,那么函数优先
  2. 如果一个var变量名与另外一个var变量名相同,那么以第一个为准
  3. 如果函数内参数名与函数名相同,以函数优选
  4. 如果函数内参数名与一个var变量相同名称,参数是第一个所以参数优先

104828720
1.4k 声望222 粉丝

编程其实很枯燥,所以一定要有追求。