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 使用手册(二)
Sep 23 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
Dec 08 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
javascript创建数组之联合数组的使用方法示例
Dec 26 Javascript
jQuery内部原理和实现方式浅析
Feb 03 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 Javascript
原生js实现秒表计时器功能
Feb 16 Javascript
Angular2开发——组件规划篇
Mar 28 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
Sep 04 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 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冒泡排序算法的深入理解
2013/06/09 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
jquery下json数组的操作实现代码
2010/08/09 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
详解Python中的静态方法与类成员方法
2017/02/28 Python
python读写json文件的简单实现
2017/04/11 Python
pygame实现简易飞机大战
2018/09/11 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
python中selenium库的基本使用详解
2020/07/31 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
配置管理计划的主要内容有哪些
2014/06/20 面试题
垃圾分类的活动方案
2014/08/15 职场文书
违纪检讨书
2015/01/27 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
Python实现日志实时监测的示例详解
2022/04/06 Python
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python