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 相关文章推荐
Auntion-TableSort国人写的一个javascript表格排序的东西
Nov 12 Javascript
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 Javascript
JQuery上传插件Uploadify使用详解及错误处理
Apr 27 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
Apr 27 Javascript
jquery心形点赞关注效果的简单实现
Nov 14 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
Nov 03 Javascript
详解webpack多页面配置记录
Jan 22 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
Java无向树分析 实现最小高度树
Apr 09 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
php2html php生成静态页函数
2008/12/08 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP错误处理函数
2016/04/03 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
js对象的比较
2011/02/26 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
python交互式图形编程实例(一)
2017/11/17 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
给学校的建议书
2014/03/12 职场文书
机关办公室岗位职责
2014/04/16 职场文书
机械系毕业生求职信
2014/05/28 职场文书
早读课迟到检讨书
2014/09/25 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL