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> 

 

posted @ 2018-06-07 18:45  bibiguo  阅读(97)  评论(0)    收藏  举报