您的位置:首页 > Web前端 > JavaScript

JS预解析,作用域

2016-06-28 16:26 190 查看

”JS解析器“需知道的两大步工作:

(1)找一些东西:var function 参数

a=未定义

所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;

fn1=function fn1(){alert(2);}

所有的函数,在正式运行代码之前,都是整个函数块。

注:遇到重名的:只留一个(变量和函数重名,只留下函数;函数和函数重名,留下后来的一个)

(2)逐行解读代码:

表达式: = + - * / % ++ – ! 参数

注:表达式可以修改预解析的值

例题:

<script>
alert(a);   //结果为function a(){alert(5);}
var a=1;
alert(a);    //1
function a(){alert(3);} //不执行
alert(a);   //1
var a=3;
alert(a);   //3
function a(){alert(5);}  //不执行
alert(a);   //3

a();  //如果此时调用函数,就会报错,因为此时a的类型是number
</script>


JS解析过程:

(1)找:

a=未定义;(第一步找到一个变量)

function a(){alert(3);}(第二步找到一个函数,此时就会只存这个函数,变量就不在这里了)

var a=3;(变量和函数存在时,留函数,所以此时还是上面那个函数)

function a(){alert(5);}(顺序,存后来的函数)

经过上述一系列的变化,最终库里只剩下了 function a(){alert(5)};

(2)解读代码:

遇到表达式的时候会更改a 的值。

函数的作用域

(一)

var a=1;
function fn1(){
alert(a);  //未定义
var a=2;
}
fn1();
alert(a);     //1


(1)预解析:a=未定义;

function fn1(){

alert(a);

var a=2;

}

(2)逐行解读代码:

表达式

函数:(调用函数的时候首先去找函数内的各个值)

1)找一些东西:var function 参数 (此时会找到var a)

a=未定义

2)逐行解读代码:表达式

(二)

var a=1;
function fn1(){
alert(a);   //1
a=2;
}
fn1();
alert(a);      //2


若上述代码去掉var:

运行到a=2时,就会改变全局的变量a=1的值。

(1)预解析:a=未定义;

function fn1(){

af81
alert(a);

var a=2;

}

(2)逐行解读代码:

表达式

函数:(调用函数的时候首先去找函数内的各个值)

1)找一些东西:var function 参数 (此时未找到a)

a=未定义

2)逐行解读代码:表达式

(三)

var a=1;
function fn1(a){
alert(a);   //1
a=2;
}
fn1();
alert(a);      //2


若加入参数a,

(1)预解析:a=未定义;

function fn1(a){

alert(a);

var a=2;

}

(2)逐行解读代码:

表达式

函数:(调用函数的时候首先去找函数内的各个值)

1)找一些东西:var function 参数 (此时会找到参数a)

a=未定义

2)逐行解读代码:表达式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: