作用域
- 作用:获取函数或变量
- 域:全局作用域、局部作用域
全局变量和局部变量
-
**全局变量:**直接在script下声明的变量,任何地方都可以访问,任何地方都能对其值进行改变
-
**局部变量:**函数内部定义的变量,函数可以访问,出了函数的花括号{}就不能被访问
-
局部变量可以访问修改全局变量
-
全局变量:任何地方都可以被访问和修改 ----------------------------------- <script> var a=10; function fun1(){ a++; console.log(a);//11 } function fun2(){ a++;//12 a--;//11 console.log(a);//11 } fun1(); fun2(); a=30; console.log(a);//30 </script> --------------------------------------------- 局部变量或函数:只可以在函数内部访问 -------------------------------------- fun3(); function fun3(){ var a=10; console.log(a);//10 function s(){ console.log('A'+a); } s(); } console.log(a);//a s();//报错 s is not defined
预解析
-
步骤
- 全局找var和function
- 变量名没有冲突,var–>undefined,function–>本身
- 变量名有冲突,选function,不管函数是否调用
- 有函数调用
- 没有参数,就和var、function一样
- 有参数
- 参数名、变量名和函数名没有冲突,就和没参数做法一样
- 参数名和变量名冲突,选参数名
- 参数名和函数名冲突,选函数名
- 逐步执行
- 全局找var和function
作用域链
- 类似绝对定位
- 从当前作用域开始往外找,直到找到全局作用域
写一些例题吧:
-
<script> alert(a); //function中的内容,一进来找var和function,然后俩名字一样,所以选择function var a=1; alert(a); // 依次往下开始执行 1,当把1赋给a的时候,就已经决定a是number类型的了 var a=2; function a(){ alert(4); } alert(a);//2 alert(typeof a);//number a();//报错,a is not a function </script>
-
var a=1; function b(){ alert(a);//undefined,有函数先解析函数 var a=2;//这是一个局部变量,只是名字正好和外面的变量名字一样了 alert(a);//2 } b(); alert(a);//1
-
var a=3; function fun(a) { /*有形参而无实参的时候, 就相当于给函数加了一个局部变量, 只是这个局部变量正好和全局变量的变量命一样了, 改变的是局部变量而不是全局变量*/ // var a; alert(a);//undefined a = 2; // a 形参 alert(a);//2 } fun(); alert(ab);//3
-
还有一些例题尚未整理,以后有机会再整