一、js变量作用域
1、全局变量:在函数外面定义的变量
2、局部变量:在函数外面定义的变量只能在函数里使用
二、浏览器解读js代码分为两个步骤
1、域解析
找一些东西:var关键字、function、参数;
所有的变量在正式运行代码之前,都提前赋了一个值,(undefined)未定义;
所有的函数在正式运行代码之前,都是整个函数块,fun=function(){...};
域解析时,遇到重名的,只留一个,如变量和函数重名,就只留下函数
2、逐行解读代码
表达式可以修改域解析的值(表达式:带+,-,*,/,=,...,参数等的式子)
三、看一些例子
1、
(1)域解析:var a=1;
function fun(){
alert(a);//undefined
var a=2;
}
fun();
alert(a);//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、
(1)域解析var a=1;
function fun(){
alert(a);//1
a=2;
}
fun();
alert(a);//2
找到一个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)域解析
(2)解读代码a=undefined;
fun=function fun(){....}
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。