码迷,mamicode.com
首页 > 编程语言 > 详细

JAVASCRIPT基础01-作用域

时间:2014-07-05 18:16:26      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   使用   

<!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>

 

JAVASCRIPT基础01-作用域,布布扣,bubuko.com

JAVASCRIPT基础01-作用域

标签:style   blog   http   java   color   使用   

原文地址:http://www.cnblogs.com/liaokailin/p/3822788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!