JavaScript中的坑--全局变量惹得祸_21331的博客-程序员秘密

技术标签: ViewUI  java  javascript  

js中变量的作用域及闭包的概念

 

概述

身为一名程序员,因为bug周末加班是必不可少的事情,当解决bug的时候,总有些bug是因为规范导致的,但是这些bug往往不好找,也就是“前人挖坑,后人好踩”。前段时间,出现了一个很莫名其妙的bug

就是有个模块页面数据不对。当时找了半天(以为是页面传值的问题),到最后才发现 主页面引用的几个js文件中存在一个相同的全局变量。

 

对js中的变量作用域的误解 

很多写js的都是需要前后台一起写的,我就是后台java,前台js分模块一起写的。在这里,我有一个误区,就是以为js和java中的语法是一样的。但实际上还是存在着一些不同的地方。比如js中作用域只是函数级别的

   1:在{}体内定义的局部变量,和在{}体外定义的局部变量 实际上是一个,并不会新建

   2:在函数体内定义的局部变量 ,和函数体外定义的没什么关系。

方便记忆的代码如下:

1  <script>
2              var test_id = "my love";
3               if(true){
4                   console.log(test_id);
5                   var test_id = "where my love?";
6                   console.log(test_id);
7               }
8               console.log(test_id);
9          </script>

 

显示结果:

  

这就是js中没有块级作用域的证明: 很显然发现test_id实际上只有一个

证明js中变量是函数级别的

 <script>
             var test_id = "my love";
              function findLove(){
                  var test_id ;
                  console.log(test_id);
                  test_id = "is you?";
                  console.log(test_id);
              }
              findLove();
              console.log(test_id);
         </script>

 

输出结果:

 

然后我试了一下: 在{}体内不用var声明:

<script>
             var a = "heh"
             if(true){
                 console.log(a);
             }
         </script>

 

其实也是可以的 输出 heh

试一下 函数体内部用var ,注意一下:代码不同之处

1  <script>
2              var a = "heh"
3              function findLove(){
4                  console.log(a);
5              }
6              findLove();
7          </script>

 

  <script>
             var a = "heh"
             function findLove(){
                 console.log(a);
                 var a
             }
             findLove();
         </script>

 

 第一个输出的是 heh ;第二个输出的是 undifined,一目了然。这个地方 还有一个细节:就是在函数体内,先定义后打印和先打印和定义,实际上是一样。

自我测试一下吧:(猜一下输出结果,在验证一下吧)

 <script>
             var a = "heh"
             function findLove(){
                 console.log(a);
                 function findforyou(){
                     var a ="you";
                     console.log(a);
                 }
                 function findother(){
                     console.log(a)
                 }
                 findforyou();
                 findother();
             }
             findLove();
         </script>

 

 

 

二:函数闭包

  因为js中变量的作用域是函数级的,所以用闭包来解决一些传值问题(比如递归)。篇幅太长了,另起一篇博客

 

总结

  新人,发自肺腑的总结,希望可以帮助到你。另外,也希望可以多多支持,转载说明出处,谢了。必当结草衔环,勤恳不往初心

参考资料 

参考自下面的博客: 学习的时候,不建议直接去看作用域啥的。就是自己找个编辑器,试一下,一目了然。

http://blog.csdn.net/yueguanghaidao/article/details/9568071

 

转载于:https://www.cnblogs.com/ldh-better/p/6626671.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a183128981/article/details/101528878

智能推荐

【190319】VC++ H.264视频解码源码源代码_资源小站的博客-程序员秘密

源码下载简介VC++ h.264视频解码源码,可设置码率以及视频格式,cif或者qcif。源码下载地址:点击下载备用下载地址:点击下载

开放-封闭原则_wangxp423的博客-程序员秘密

一,定义开放-封闭原则:是说软件实体(类,模块,函数等等)应该是可扩展的,但是不可修改。[ASD]这个原则其实是有两个特征,一个是说,对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)二,问题和方案问题由来: 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引...

RDKit化学式 分子式搜索-程序员秘密

RDKit是一个用于化学信息学的开源工具包,基于对化合物2D和3D分子操作,利用机器学习方法进行化合物描述符生成,fingerprint生成,化合物结构相似性计算,2D和3D分子展示等。将化学与机器学习联系起来的、非常实用的库。可以在很多种化学文件如mol2,mol,Smiles,sdf等之间互相转化,并能将其展示成2D、3D等形式供开发人员使用SMILES(Simplified molecular input line entry system),简化分子线性输入规范,是一种用ASCII字符串明确

vue3 父组件调用子组件中方法_vue3 父组件如何调用子组件_Misha韩的博客-程序员秘密

方案一子组件中:定义方法,fnName() {…}父组件中:setup() {let childRef = ref(null)return {childRef }}调用:this.childRef.value.fnName()方案二

JVM-入门第一篇_使用指定的图像显示启动屏幕_Jack魏的博客-程序员秘密

JVM-入门第一篇1.基本概念2. java -help 命令3. java -X 命令4. javac -help 命令Java程序员不可不知的秘密 JVM1.基本概念JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。[来自百度百科]2. java -help 命令用法: java [-options] class [args…](执行类)或 jav

随便推点

以Api方式设计程序的优缺点 php,php中link -MySQL数据库服务器时常用的三种主要的API:mysql,mysqli,pdo区别及联系..._艾弥儿的博客-程序员秘密

/**看了很多相关数据库连接和操作后对php中数据库连接的一个自我小结吧------------希望有所益处*///1 连接类型/**php中link -MySQL数据库服务器时常用的三种主要的API:mysql,mysqli,pdo区别及联系/********基本相关信息*********/a.API----------------Application Programming Interfac...

如何通过深度学习,完成计算机视觉中的所有工作?_深度学习中的计算机视觉_喜欢打酱油的老鸟的博客-程序员秘密

Mask-RCNN做对象检测和实例分割作者 | George Seif译者 | 天道酬勤,责编 | Carol出品 | AI科技大本营(ID:rgznai100)Mask-RCNN做对象检测和实例分割:https://miro.medium.com/max/1200/1*s9raSe9mLeSSuxE3API-ZA.gif你想做计算机视觉吗?如今,深度学习是必经之路。...

Qt中俩个类发射信号关联_qt两个类之间发送信号_牵着我的猪去看海的博客-程序员秘密

Qt中俩个类发射信号关联举个例子A类、B类想关联通信在A类.h文件中定义一个signals 信号在A类.cpp文件中发射此信号 emit 信号在B类.h文件中定义一个private/public slot:信号槽在B类中.cpp文件添加 connect(A类,SIGNAL(A类的信号),B类,SLOT(B类的信号槽));就这样完成了俩个类之间的信号关联例子代码如下:A类.h文件signals: void tcpstart();//与主界面关联信号,用于开始通信A类.cpp文

UCOSIII钩子函数_os_cpu_exceptstkbase_thomas_blog的博客-程序员秘密

OSIdleTaskHook 空闲任务调用这个函数,可以用来让CPU进入低功耗模式void OSIdleTaskHook (void){#if OS_CFG_APP_HOOKS_EN > 0u if (OS_AppIdleTaskHookPtr != (OS_APP_HOOK_VOID)0) { (*OS_AppIdleTaskHookPtr)(); }#e

hdoj 4548 美素数《打表》_leibniz_zhang的博客-程序员秘密

美素数Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 5564    Accepted Submission(s): 1953Problem Description  小明对数的研究比较热爱,一谈到数,脑子里

HTML5 网页添加背景音乐_我是个懒人的博客-程序员秘密

方式一:&amp;lt;video controls=&quot;&quot; autoplay=&quot;&quot; name=&quot;media&quot;&amp;gt; &amp;lt;source src=&quot;音乐&quot; type=&quot;audio/mpeg&quot;&amp;gt;&amp;lt;/video&amp;gt;    这种方式会显示播放器。方式二:&amp;lt;embed src=&quot;music/We Don't Talk A

推荐文章

热门文章

相关标签