1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <script type="text/javascript">
 9         /*
10      一个变量的作用域(scope)是程序源代码中定义这个变量
11      的区域。
12      全局变量拥有全局作用域,然而在函数内声明的变量
13      只在函数体内定义,它们是局部变量,作用域是局部性的
14      函数参数也是局部变量,它们只在函数体内定义*/
15 
16      //局部变量的优先级高于同名的全局变量
17      //---->如果在函数内声明的一个局部变量或者函数参数中带有变量和全局变量重名
18      //---->全局变量就被局部变量所遮盖
19      var scope="global";//声明一个全局变量
20      function checkscope() {
21           
22           var scope="local";//声明同一个局部变量
23           return scope;//返回局部变量的值,而不是全局变量的值
24 
25 
26      }
27       checkscope()
28 
29       console.log(checkscope()) //"local"
30 
31       //--->1--全局作用域编写代码时可以不写var语句 ,声明局部变量时则必须使用var语句
32       scope="global";// 声明一个全局变量,甚至不用var
33       function checkscope2(){
34           scope="local";  //修改了全局变量
35           myscope="local" //这里显示地声明了一个新的全局变量
36           return [scope,myscope]; //返回两个值
37       }
38       checkscope2()//函数调用
39       console.log(checkscope2()) //=>["local","local"]
40       //---->2--函数定义是可以嵌套的,由于每个函数都有它自己的作用域 ,因此会出现几个局部作用嵌套的情况
41 
42       var scope="global scope"; //全局变量
43       function checkscope(){
44           var scope="local scope";//局部变量
45           function nested(){
46               var scope ="nested scope";//嵌套作用域内的局部变量
47               return scope; //返回当前作用域内的值
48 
49           }
50           nested() //嵌套函数调用
51 
52       }
53       checkscope() //=>"嵌套作用域"
54    
55    /*
56    函数作用域和声明提前
57     1--->类似C 语言的编程--花括号内的每一段代码都具有各自的作用域
58           而且变量在声明它们的代码段之外是不可见的,称为块级作用域(block scope)
59           javascript中没有块级作用域
60           javaScript取而代之使用了函数作用域:
61           变量在声明它们的函数体以及这个函数体嵌套任意函数体内都是具有定义的
62 
63    */
64    //----1-->
65    function test(o){
66        var i=0; //i 在整个函数体内均是有定义的
67        if (typeof o=="object"){
68            var j=0; //j在函数体内是有定义的,不仅仅是在这个代码段内
69            for(var k=0;k<10;k++){ //k在函数体内是有定义的,不仅仅是在内循环
70                console.log(k);//输出数字0~9
71 
72 
73            }
74 
75            console.log(k);  //k已经定义了,输出10
76        }
77        console.log(j);  //j已经定义了,但可能没初始化
78    }
79    //javascript的函数作用域是指在函数内声明的所有变量在函数体内始终可见
80    //意味着变量在声明之前甚至已经可用,javascript  这个特性被非正式的称为声明提前
81 
82    // javascript 函数里声明所有变量都被提前至函数体内部
83    var scope="global";
84    function f(){
85 
86        console.log(scope);//输出undefind ,"而不是“global"
87        var scope="local";//变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
88        console.log(scope);//输出“local”
89    }
90 
91 
92     </script>
93 
94 </body>
95 </html>