JS解析与执行过程

问题

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

var a = 10;  // 声明
alert(a);  // 调用

但在JS中,咱们发现,以下:编程语言

alert(a);  // 使用变量
fn();   // 调用fn函数

var a = 10;  // 声明
function fn(){}

为何能够 先使用后声明 呢?函数

主要由于是JS解析与执行过程当中的  **预处理**

分类

JS解析与执行过程分红2部分code

一、全局 (JS一开始解析与执行的地方)
二、函数 (函数调用才开始解析与执行)

全局

全局JS代码执行分为2个阶段 (JS一开始就执行如下2个阶段)io

1. 预处理阶段
2. 执行阶段

预处理主要处理如下2种代码function

一、全局中的函数声明
二、全局中的用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变量test

函数

函数体内JS代码执行分为2个阶段 (函数调用时,执行如下2个阶段)变量

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变量相同名称,参数是第一个因此参数优先
相关文章
相关标签/搜索