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

智能推荐

获取TextView每行的内容 (涉及getLineCount为0,getLineEnd问题)_layout.getlineend_monk_CD的博客-程序员秘密

代码如下: class LineContent inplements Runnable{ private TextView mTarget; public LineContent(TextView target) { mTarget = target; } public void run() { GetEachLineCon

v-html 解析并插入 html 标签_html v-html_灵灵7的博客-程序员秘密

1. 双大括号会将数据解释为普通文本,而非 HTML 代码。&amp;lt;div id=&quot;app&quot;&amp;gt; &amp;lt;p id=&quot;a&quot;&amp;gt;Using mustaches: {{ rawHtml }}&amp;lt;/p&amp;gt;&amp;lt;p &amp;gt;Using v-html directive: &amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;body&a

车载相机(摄像头)诊断_max20087_lyp90h的博客-程序员秘密

相机作为视觉控制器最重要的传感器之一,并且作为一种可拔插的设备,判断其功能是否正常工作是非常重要的。相机的诊断我认为可以分为以下三种类型:电源诊断,包括相机开路、短路、过流过压等电源故障的判断 图像信号诊断,包括视频流信号是否正常、控制信号是否正常、帧率、分辨率等图像信号故障的判断 图像质量诊断,包括相机是否被遮挡、安装位置是否正常等故障的判断电源诊断我们的控制器使用了Maxim的max20087作为相机PoC的PMIC,按美信的说法是该款芯片是“业界唯一的ASIL级摄像机保护器”,最..

写一个工具类,类中定义静态方法,实现数组的升序排序(选择和冒泡分别写一个类)_定义一个统计类,包含一个静态方法“工资排序”,方法接收一个员工类数组,对数组中_羞紅了脸的博客-程序员秘密

Java学习到了静态方法,第一次发文章,望大家多多指点  (*^_^*)要解答此题,首先,我们要了解到题目里所要用到的知识内容1、静态方法:先于对象的方法,不依赖与对象,可以通过类名直接调用。public class Person{      public static void fun(){        System.out.println(&quot;fun&quot;);      }...

PHP中 curl 采用postcurl getcurl 方式 以及http发送josn 与获取外部数据的方式_coreyC的博客-程序员秘密

如果有用请点赞curl  采用POST   方式发送数据请求/** * POST方式请求数据 * @param $url 请求地址 * @param $mes 传递数据 * @param $timeout 失效时间 * @return string */ function postcurl($url,$mes,$timeout){ $ch = cu...

The useage of statfs function_easecom的博客-程序员秘密

#include #include#include #include #define Gsize (1024.00*1024.00*1024.00)#define Msize (1024.00*1024.00)#ifndef EXT2_SUPER_MAGIC#define EXT2_SUPER_MAGIC 0xef53#endifint main(){        long long

随便推点

AVAudioRecorder_MeteoriteMan的博客-程序员秘密

0 使用前准备这是一个录制音频的类.1.需要设置AVAudioSession.2.需要在info.plist中添加相应的字段0.1 设置AVAudioSession接收音频输入NSError *error;AVAudioSession *session = [AVAudioSession sharedInstance];if ([session setCategory:AVAudio...

【玩转yolov5】来自茱丽叶的letterbox_yolo letterbox_昌山小屋的博客-程序员秘密

数据集中的图片一般为长方形,当模型输入为正方形时直接将长方形图片resize为正方形会使得图片失真,采用letterbox(啥意思?邮箱盒子!)通过填充边界(通常是灰色填充)的方式来保持原始图片的长宽比例,同时又满足模型正方形输入的需要。这里以我做训练时使用的一张bdd100k中的图片为例直观感受一下即可。import cv2 import matplotlib as pltimport numpy as npimg_size = 640 #yolov5默认输入图片尺寸640x640...

如何修改Linux字体大小,如何更改字体并调整字体大小?_刘新征的博客-程序员秘密

问题更改字体的最简单方法是什么?我更愿意使用简单的图形方式,但是命令行建议的答案也欢迎。答案113.04和更高版本对于Unity界面用户,可以使用unity-tweak-tool对于Unity界面用户,他们有自己的调整工具,自定义字体在12.04可以通过myunity用于gnome-shell/组合gnome-shell&amp;统一用户,可以通过gnome-tweak-tool如下所述自定义字体...

除了按照其它博客所述调整Visual Studio的设置,CUDA调试还必须注意的三点_寒霜雨刃的博客-程序员秘密

Nsight诸版本下载,下载前请仔细阅读DocumentationDocumentation中的“System Requirements for NVIDIA Nsight VSE Software”一节极其重要,请仔细阅读,尤其注意以下两点1、对显示驱动的版本要求,安装与显示驱动版本最相近的Nsight。例如,若安装了451.67版本的驱动,那么选择Nsight 2020.1最为合适。若某一台电脑,安装了CUDA 10.1自带的Nsight 2019.3,并手动更新到451.67版本的驱动,由于Ns

HTML展开头文件,html头文件css的写法_陈以侃的博客-程序员秘密

html头文件css的写法发布时间:2021-02-12 18:08:59来源:亿速云阅读:103作者:小新小编给大家分享一下html头文件css的写法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html头文件css的写法:1、通过“/*这里写CSS内容*/”方式引入css;2、使用“”标签,引入外部CSS文件。头文件...

关于GIS相关的网络资源_zhou_sheng的博客-程序员秘密

<!--google_ad_client = "pub-3250284447844828";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";google_ad_channel ="";google_color_

推荐文章

热门文章

相关标签