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中增加参数与Json转换代码
Nov 20 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
Jun 27 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
Jan 26 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
快速掌握jQuery插件WebUploader文件上传
Nov 07 Javascript
学习vue.js中class与style绑定
Dec 03 Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
vue实现密码显示与隐藏按钮的自定义组件功能
Apr 23 Javascript
微信小程序实现菜单左右联动
May 19 Javascript
JavaScript实现简单验证码
Aug 24 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中array_slice函数用法实例详解
2014/11/25 PHP
两款万能的php分页类
2015/11/12 PHP
php文件上传类完整实例
2016/05/14 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
英国高街电视:High Street TV
2018/05/22 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
创优争先心得体会
2014/09/11 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
趣味运动会开幕词
2015/01/28 职场文书
应聘教师自荐信
2015/03/26 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
Python中的pprint模块
2021/11/27 Python