最近一直在看《javascript权威指南 第五版》,变量作用域这一章,看得真的有点累。不过,收获还是多多。

不知道,大家对语言中变量的“声明”与“定义”是怎么理解的,

我的理解如下:

“声明”变量,只是仅仅声明,而“定义”变量,指声明了,并且赋值了。

例如:

var name;//只是声明var num = 11;//声明,并且赋值,即定义了var password  = "yangjiang";//声明,并且赋值,即定义了

下面是几点总结:

变量的作用域:全局的和局部的。(注意:如果尝试读取一个未声明的变量的值,javascript会生成一个错误)

第一点:在都使用var关键字修饰变量的情况下,如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,

那么就有效地隐藏了这个全局变量。

例如:

var scope1 = "global";//var修饰function checksScope(){var scope1 = "local";//var修饰    document.write(scope1);}
checksScope();//local

第二点:如果尝试给一个未用 var 关键字声明的变量,那么,隐式声明的变量总是被创建为全局变量,即使

该变量只在一个函数体内使用(只有该函数运行了,才会发生作用),注意不支持函数嵌套的情形。

例如:

     scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)     function checkScopeA(){         scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)         document.write("<br/>"+scope2);         myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)         document.write(","+myscope);     }     checkScopeA();//localAAAAA,myLocalAAAAA           *A     document.write("<br/>"+scope2);//localAAAAA        *B     document.write("<br/>"+myscope);//myLocalAAAAA     *C

如果将上面的例子中的 *A处的代码注释掉,

例如:

      scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)      function checkScopeA(){         scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)         document.write("<br/>"+scope2);         myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)         document.write(","+myscope);      }//checkScopeA();                                   *A      document.write("<br/>"+scope2);//globalAAAAA       *B      document.write("<br/>"+myscope);//发生错误          *C

因为函数checkScopeA没有执行,所以 *B处输出为globalAAAAA;

因为函数checkScopeA没有执行,所以变量myscope没有声明,如果尝试读取一个未声明的变量,会发生错误。

第三点:

在javascript中,函数的定义是可以嵌套的。由于 每个函数都有它自己的局部作用域,所以有可能出现几个局部作用域的嵌套层。

例如:

      var scope3 = "global scope";    //定义了一个全局变量      function checkScopeB(){var scope3 = "local scope";  //定义了一个局部变量,覆盖了全局变量scope3          function nested(){var scope3 = "nested scope";   //在函数的函数的内部,定义了一个局部变量             document.write("<br/>"+scope3);  //nested scope        }        nested();      }      checkScopeB();//nested scope

第四点:

在javascript中,没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有声明的。

在javascript中,没有块级作用域,函数中定义的所有变量,无论是在哪里定义的,在整个函数中它们都是有定义的。

例如:

      function test(o){//根据以上的说明:此函数中的i,j,k三个变量的作用域是相同的。           var  i = 0;               //变量 i 在整个函数中都有定义           if(typeof o == "object"){var j = 0 ;            //变量 j 在整个函数中都有定义,而不仅仅是在 if 语句块              for(var k=0;k<10;k++){//变量 k 在整个函数中都有定义,而不仅仅是在 if 语句块                 document.write("<br/>k的值为:"+k);              }              document.write("<br/>for循环外k的值:"+k);//此时的 k 仍然被定义了,k=10           }           document.write("<br/>j的值:"+j);     //变量 j 被声明了,但可能没有被初始化 因为可能往函数中 传入的参数 不是对象 ,if语句块不会执行      }

下面通过两种方式调用此函数:

方式一:传入对象

test({});//输出结果:上例中的注释

方式二:什么都不传

test();//输出结果:j的值:undefined

想不明白的是,在第二种方式中的输出结果,为什么会是 undefined。我当时猜的是:j的值:0

后来,这本书上面说:

由于局部变量在整个函数体内都是有声明(或定义)的,这就意味着在整个函数体中都隐藏了同名的全局

变量。虽然 局部变量在整个函数体内中都是有声明(或定义)的,但是在执行var语句之前,它是不会被初始化的。

这样的话,上面的方式二调用的输出结果,就比较好解释了,由于变量j在整个函数中都有定义,而又由于传入函数的参数为空,所以函数体中的if语句不会执行,从而使得j的值为undefined.(这是我参照上面书上说的那句话的理解)

下面的例子,更好的说明:

      var sssss = "全局变量";function f(){          document.write("<br/>"+sssss);//输出:undefined    而不是输出"全局变量"          var sssss = "局部变量";          document.write("<br/>"+sssss);//输出:局部变量      }

转载于:https://www.cnblogs.com/yj443035414/archive/2011/09/27/2193587.html

javascript权威指南 学习笔记之变量作用域相关推荐

  1. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! JavaScript 权威指南-学习笔记 ...

  2. Javascript权威指南学习笔记一:数据类型

    决定从最基础的开始学JavaScript,最近看了<<Javascript权威指南>>第3章,记些笔记备忘. 本章一个重点是类型.按我的理解应该如下表所示: 复合类型中,关联数 ...

  3. javascript权威指南学习笔记

    一.数据类型: js中,所有的数字都是浮点型的. isNaN()/isFinite()     //检测数据类型 Infinity               //无穷大 Number.MAX_VAL ...

  4. javascript权威指南--学习笔记

    -一.JavaScript基本数据类型 1.数字--Number类 2.字符串--String类 3.布尔--Boolean类 4.函数Function 5.对象Object 6.数组Array 7. ...

  5. 《JavaScript权威指南》笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> <JavaScript权威指南>真是名符其实的好书!真遗憾初学JavaScript时没有立即读这本书,甚为遗憾.不 ...

  6. 《JavaScript权威指南》笔记(四)

    2019独角兽企业重金招聘Python工程师标准>>> 第四篇笔记的内容主要涉及:javascript中的各种语句. 1. switch语句: (1)其中的case表达式采用===匹 ...

  7. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  8. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  9. php学习笔记0001 变量作用域

    <?php /* 2015-8-6 php学习笔记0001 函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行 ...

最新文章

  1. java 点与线的距离_计算地图上点与线段距离
  2. HTML打开服务器的exe,打开远程服务器的html
  3. 基于知识图谱的行业问答系统搭建分几步?
  4. log4j2 mybatis 显示 sql 和 结果集
  5. C++---两数之和
  6. COLLEGE.sql(复制的时候注意路径!!!)
  7. poj 3071 Football
  8. Python函数嵌套定义的洪荒之力
  9. 四维图新地图坐标_四维图新:自动驾驶的“高精度地图世界观”
  10. 第一次登录域控服务器的账号,windows域登录与SSO服务器整合
  11. 正经分析iOS包大小优化
  12. python3抓取aqi
  13. 柱状图python_化学领域里「过柱子」是什么意思?柱子干了为什么可怕?
  14. 产品经理的职责-----产品经理深入浅出课程
  15. Android跑马灯效果
  16. java 围棋代码_java围棋源代码
  17. USB学习笔记(4)STM32关于USB库的解读
  18. Nagios部署与配置
  19. RFID无人机之智能仓储管理系统应用
  20. 知乎上万赞回答:年薪百万的程序员背后到底有多艰辛?

热门文章

  1. AcWing提高算法课Level-3 第六章 基础算法
  2. 【JSOI2014】【BZOJ5039】序列维护(线段树模板)
  3. UVa1225 - Digit Counting
  4. 如何画正太分布曲线_python scipy.stats实现各种常见的统计分布
  5. jquery自定义动画animate方法
  6. 多校训练 Naive Operations线段树区间更新
  7. java底层app_Java底层类和源码分析系列-ArrayBlockingQueue底层架构和源码分析
  8. python的缩进规则是什么意思_Python编程思想(2):Python主要特性、命名规则与代码缩进...
  9. b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】
  10. 计算机网络—GBN协议(后退N帧协议)