关于作用域和域解析

来源:互联网 发布:mac电磁阀说明书 编辑:程序博客网 时间:2024/06/03 21:02

一、js变量作用域

1、全局变量:在函数外面定义的变量

2、局部变量:在函数外面定义的变量只能在函数里使用

二、浏览器解读js代码分为两个步骤

1、域解析

找一些东西:var关键字、function、参数;

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

所有的函数在正式运行代码之前,都是整个函数块,fun=function(){...};

域解析时,遇到重名的,只留一个,如变量和函数重名,就只留下函数

2、逐行解读代码

表达式可以修改域解析的值(表达式:带+,-,*,/,=,...,参数等的式子)

三、看一些例子

1、

var a=1;

function fun(){

alert(a);//undefined

var a=2;

}

fun();

alert(a);//1

(1)域解析:

找到一个var关键字,a=undefined;

找到一个函数,fun=function fun(){....}

(2)逐行读代码

var a=1,所以a=1;

然后有一个函数;

fun(),此处调用函数fun(),进入函数里,函数也是一个作用域,所以按步骤进行:

域解析:a=undefined

读代码:alert(a),a的值为undefined

a=2

函数外面的alert(a),此时的a为1,函数里的a的值为2,但是那是函数里,是局部。


2、

var a=1;

function fun(){

alert(a);//1

a=2;

}

fun();

alert(a);//2

(1)域解析

找到一个var关键字,后面的变量a赋值为未定义undefined;

找到一个函数,fun=function fun(){...}

(2)逐行解读代码

a=1;

函数;

fun(),调用函数,进入函数,想对函数域解析,但是并没有发现var关键字、function或者参数,直接解读代码:

执行到alert(a)时,并没有在局部小仓库里发现关于a的值,所以会跳到上一级去找,此时发现a=1,所以弹出1;

执行到a=2时,也没有发现a,所以也找到了父级,修改a的值为2;

最后一句alert(a),弹出2。

(关于一个函数内部的变量,如果内部没有声明,就去上一级找,如果函数外也没有,就会报错。)


3、

var a=1;

function fun(a){

//var a;

alert(a);//undefined

a=2;

}

fun();

alert(a);//1

(1)域解析

a=undefined;

fun=function fun(){....}

(2)解读代码

a=1;

函数;

fun(),对函数进行域解析,此时发现有一个参数a,相当于定义了一个a变量,即var a;所以a=undefined

alert(a),弹出undefined;

a=2;此时的2是给函数里的a赋值为2;

alert(a),弹出全局的a,值为1。


4、

var a=1;

function fun(a){

alert(a);//1

a=2;

}
fun(a);
alert(a);//1

(1)域解析

a=undefined;

fun=function fun(){....}

(2)解读代码

a=1;

函数;

fun(a),此时发现传入了参数a,这个a的值是全局的a,值为1,进入函数,传了一个1进去,所以alert 1;

a=2;这还是局部的a;

alert(a),这个a还是函数外的a,所以弹出的还是1。





原创粉丝点击