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 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
原生 JS Ajax,GET和POST 请求实例代码
Jun 08 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
Sep 14 Javascript
vue单页缓存存在的问题及解决方案(小结)
Sep 25 Javascript
微信小程序之事件交互操作实例分析
Dec 03 Javascript
JavaScript实现无限级递归树的示例代码
Mar 29 Javascript
vue如何限制只能输入正负数及小数
Jul 04 Javascript
vue设置一开始进入的页面教程
Oct 28 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/10/30 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
js实现文本框中焦点在最后位置
2014/03/04 Javascript
js查找节点的方法小结
2015/01/13 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
javascript实现留言板功能
2020/02/08 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
倩碧美国官网:Clinique美国
2016/07/20 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
北京大学自荐信范文
2014/01/28 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
建筑工地文明标语
2014/10/09 职场文书
北京故宫的导游词
2015/01/31 职场文书
项目经理岗位职责
2015/01/31 职场文书
导游词之南京栖霞山
2019/10/18 职场文书