day-8.4 函数的作用域
一个document(web文档)
JS最大的作用域是script标签之间
1 <script> 2 //code 最大的作用域 3 </script>
函数执行的时候会产生新的作用域
定义在script标签里的叫全局变量,定义在函数里面的叫局部变量
1 function aaa (x,y){ //aaa是全局变量 2 var c = 30; 3 var d = 30; 4 function bbb (x,y ){ //所有非直接定义在script标签里面的变量都为局部变量 5 var a = 80 6 var b = 90 7 } 8 bbb (); //产生作用域bbb 9 function ccc (x,y){ 10 var a = 900; 11 var b =800; 12 alert (c); 13 } 14 ccc(); //产生作用域ccc,会寻找到父级函数aaa的变量c, 15 } 16 aaa(); //产生作用域aaa
作用域链的概念:
查找变量:在某一个函数作用域内查找某一个变量,当这个函数作用域内没有该变量时,会往他的父级作用域去查找,以此类推,知道找到为止,如果找到了最高级别的作用域,也就是<script></script>作用域还没有找到的话,程序就会报错。
修改变量:在某一个作用域内修改某个变量的值,跟查找一样,假设没有依次网上类推,知道script都找不到的话,则在本作用域新建该变量。
1 <script> 2 var a = 10 ; //2、这个也注释掉后,JS会创造一个全局变量a,并赋值20,下面会弹出20; 3 var b = function (){ 4 var a = 10; //1、这个注释掉后,将可以修改外面的a,下面会弹出20 5 a=20; //这里只修改了作用域内的a ,在提升成全局变量时,如果是严格模式会报错,建议最好不要这么写,变量哪里需要就要在哪里创建,不然影响可读性和维护性。 6 } 7 b(); 8 alert(a); //弹出10,是外面的a 9 </script>
兄弟作用域 ,兄弟作用域间的变量不共享
1 var a = function(){ 2 var b = function (){ 3 //code
var d = 10
4 } 5 var c = function (){ //b和c为兄弟作用域 6 //code
alert(d); //报错
7 } 8 }
一个web的document里面2个script不算2个作用域,他们只是一个先后顺序 ,如果alert(a);放在前面 ,var a = 10放在后面,会读不到。会报错。
1 <script> 2 var a = 10; 3 </script> 4 <script> 5 alert(a) //可以读到上面定义的a=10; 6 </scirpt>
浙公网安备 33010602011771号