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 学习笔记(四)
Dec 31 Javascript
jquery 选项卡效果 新手代码
Jul 08 Javascript
瀑布流布局并自动加载实现代码
Mar 12 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
jQuery通过Ajax返回JSON数据
Apr 28 Javascript
JavaScript获取服务器端时间的方法
Nov 29 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
May 16 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
20个必会的JavaScript面试题(小结)
Jul 02 Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 Javascript
JavaScript oncopy事件用法实例解析
May 13 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 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 5.3.5安装memcache注意事项小结
2011/04/12 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
优化javascript的执行速度
2010/01/23 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
Sea.JS知识总结
2016/05/05 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
python三元运算符实现方法
2013/12/17 Python
Python切片操作深入详解
2018/07/27 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
python中加背景音乐如何操作
2020/07/19 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
护理专业毕业生自荐信范文
2014/01/05 职场文书
投资协议书范本
2014/04/21 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js