Javascript学习之谈谈JS的全局变量跟局部变量(推荐)


Posted in Javascript onAugust 28, 2016

今天公司一个实习小妹子问我两段JS代码的区别:

代码一:

<script type="text/javascript">
 var a = "Hello";
 function test(){
   var a;
   alert(a);
   a = "World";
   alert(a);
 }
</script>

代码二:

<script type="text/javascript">
 var a = "Hello";
 function test(){
   alert(a);
   a = "World";
   alert(a);
 }
</script>

我想,好简单呀,不就是全局变量跟局部变量的scope问题吗?我说:"当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope。所以两段代码运行的结果分别为:1) undefined World 2) Hello World。然后我随意编了如下一个例子给她:

<script>
  var a =1;
  function test(){
    alert(a);
    var a = 2;
    alert(a);
  }
  test();
  alert(a);
 </script>

大家猜结果等于多少?是输出1 2 1 吗?嗯嗯,当我把测试case发给她之前也是这么认为的,但测试输出后……运行结果是 undefined 2 1。当时百思不得其解,问了谷老师才知道,我对JS还不是非常了解,所以痛下苦功,学习+测试,总结如下:

一、Javascript的变量的scope是根据方法块来划分的(也就是说以function的一对大括号{ }来划分)。切记,是function块,而for、while、if块并不是作用域的划分标准,可以看看以下几个例子:

<script>
function test2(){
  alert ("before for scope:"+i);  // i未赋值(并不是未声明!使用未声明的变量或函数全抛出致命错误而中断脚本执行)

                          // 此时i的值是underfined
  for(var i=0;i<3;i++){
    alert("in for scope:"+i); // i的值是 0、1、2, 当i为3时跳出循环
  }
  alert("after for scope:"+i); // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3
  
  while(true){
    var j = 1;
    break;
  }
  alert(j);  // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1

  if(true){
    var k = 1;
  }
  alert(k); //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}

test2();
//若在此时(function scope之外)再输出只存在于test2 这个function scope里的 i、j、k变量会发生神马效果呢?
alert(i); //error! 没错,是error,原因是变量i未声明(并不是未赋值,区分test2函数的第一行输出),导致脚本错误,程序到此结束!
alert("这行打印还会输出吗?"); //未执行
alert(j); //未执行
alert(k); //未执行
</script>

二、Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。怎么理解呢?看下面一个例子:

<script>
  var a =1;
  function test(){
    alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,
           //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,
           //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。
    a=4    
    alert(a); //a为4,没悬念了吧? 这里的a还是局部变量哦!
    var a;   //局部变量a在这行声明
    alert(a); //a还是为4,这是因为之前已把4赋给a了
  }
  test();
  alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>

三,当全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回到全局变量的scope,而当全局变量遇上局部变量时,怎样使用全局变量呢?用window.globalVariableName。

<script>
  var a =1;
  function test(){  
    alert(window.a); //a为1,这里的a是全局变量哦!
    var a=2;   //局部变量a在这行定义
    alert(a); //a为2,这里的a是局部变量哦!
  }
  test();
  alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>

当然更多的文章可以参考下面的相关文章。

Javascript 相关文章推荐
javascript下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
Nov 09 Javascript
jQuery实现可拖动的浮动层完整代码
May 27 Javascript
js获取location.href的参数实例代码
Aug 02 Javascript
JS与C#编码解码
Dec 03 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
Jan 08 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
Bootstrap源码解读导航条(7)
Dec 23 Javascript
jQuery实现限制文本框的输入长度
Jan 11 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
Jan 21 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 #Javascript
教你如何在Node.js中使用jQuery
Aug 28 #Javascript
分享JavaScript监听全部Ajax请求事件的方法
Aug 28 #Javascript
Node.js 日志处理模块log4js
Aug 28 #Javascript
node.js中 stream使用教程
Aug 28 #Javascript
ionic组件ion-tabs选项卡切换效果实例
Aug 27 #Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
Aug 27 #Javascript
You might like
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
Javascript----文件操作
2007/01/18 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
基于Python的接口测试框架实例
2016/11/04 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
python GUI模拟实现计算器
2020/06/22 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
给酒店员工的表扬信
2014/01/11 职场文书
《散步》教学反思
2014/03/02 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
教师节班会开场白
2015/06/01 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android