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 相关文章推荐
JQuery datepicker 使用方法
May 20 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
利用浏览器全屏api实现js全屏
Jan 16 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
Angular中ng-options下拉数据默认值的设定方法
Jun 21 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 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文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
浅谈php命令行用法
2015/02/04 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
PHP7 windows支持
2021/03/09 PHP
javascript中的有名函数和无名函数
2007/10/17 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
详解Anaconda 的安装教程
2020/09/23 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
销售经理岗位职责
2014/03/16 职场文书
中考学习决心书
2015/02/04 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android