首页 > 代码库 > JAVASCRIPT基础01-作用域

JAVASCRIPT基础01-作用域

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title>  <script type="text/javascript">            /**           *1. 概念            *     作用域(scope)是结构化变成语言中的重要概念,它决定了变量的可见范围和生命周期           *                正确使用作用域可以使代码更清晰,作用域可以减少命名的冲突,而且是垃圾回收的基本单元           *            *     在javasript中作用域不是以花括号包围的块级别作用域(C C++ JAVA等高级语言都是块级别作用域)           *   例如:            */                    (function(){               if(true){                  var str = "Hello World !" ;               }               console.log(str) ;  //结果输出 Hello World !           })() ;                      /**            *  1.1 函数作用域            *     js的作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,称为【函数作用域】 又称为局部作用域            *     在函数中引用一个变量时,js会先搜索当前的函数作用域,如无法找到,则搜索上层作用域,直至全局作用域(这个很关键)            *   例如:            */           var v  = "global" ;           (function(){              var v = "local"              console.log(v) ;  //输出 local           })() ;                                 // 再看下面的例子                       (function(){              console.log(v) ;  //输出  undefined              var v = "local"           })() ;                      /**            * 上面的例子只是颠倒了一下顺序得到的结果完全不一样               *    输出local显然很好理解  ,那么输出undefined的例子是怎么回事呢?            *        前面说了js引用变量的顺序,按照作用域搜索顺序 ,console.log(v) ; 打印变量v时  会先搜索函数的作用域,在此作用域中搜索到了变量v的定义            *      var v = "local"  即不会去搜索外层的变量,那么在程序执行打印v的时候 v还没有被初始化结果得到了undefined            *             * 在访问未定义的变量或定义了但没有初始化的变量时,获得的值都是 undefined。            * 可以认为,无论在函数内什么地方定义的变量,[在一进入函数时就被定义了],但直到 var 所在的那一行它才被初始化,            * 所以在这之前引用到的都是 undefined 值。(事实上,JavaScript 的内部实现并不是这样,未定义变量和值为 undefined 的变量还是有区别的。)            *             *             *   再看嵌套的函数作用域            */                        var scope = "global" ;                        function foo01(){               console.log(scope) ;            }                        foo01() ; //输出  global                                  function foo02(){              var scope = "local" ;              foo01() ; //输出glocal           }           alert(1) ;           foo02() ;                      /**            *      通过 foo02调用的 foo01在查找 scope定义时,找到的是父作用域中定义的 scope变量,而不是 foo02 中定义的 scope 变量            *      这说明了【作用域的嵌套关系不是在调用时确定的,而是在定义时确定的】。            *             *  函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,            *  也就是说,js 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可以在语法分析(编译原理一书中会详解这个概念)时确定,而不必等到运行时确定。            *             *             * 1.2  全局作用域            *      在 JavaScript 中有一种特殊的对象称为【全局对象】 在浏览器中对应的是 window 对象            * 由于全局对象的所有属性在任何地方都是可见的,所以这个对象又称为 全局作用域。全局作用域中的变量不论在什么函数中都可以被直接引用,而不必通过全局对象            * 满足以下条件的变量属于全局作用域:            *     在最外层定义的变量;            *     全局对象的属性;            *     任何地方隐式定义的变量(未定义直接赋值的变量,即不通过 var 声明直接赋值的变量)。            */             </script></head><body></body></html>