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

 

概述

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

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

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

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

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

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

方便记忆的代码如下:

  <script>
var test_id = "my love";
if(true){
console.log(test_id);
var test_id = "where my love?";
console.log(test_id);
}
console.log(test_id);
</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 ,注意一下:代码不同之处

  <script>
var a = "heh"
function findLove(){
console.log(a);
}
findLove();
</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

JavaScript中的坑--全局变量惹得祸的更多相关文章

  1. JavaScript中局部变量与全局变量的不同

    JavaScript中局部变量与全局变量 我们知道,JavaScript的变量是松散型的变量,也就是说,其变量只需用var声明,其赋值的类型是不限定的.比如: var person=18; perso ...

  2. JavaScript中的坑

    内容:关于JavaScript中的一些蛋疼的问题以及面试笔试中常见的一些坑爹套路总结 此部分内容持续总结完善中... 1.undefined和null的区别 null: Null类型,代表空值,代表一 ...

  3. 对JavaScript中局部变量、全局变量和闭包的理解

    对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...

  4. javascript 中event是全局变量

    The only thing I can think of is that event is in fact window.event and it makes itself available wh ...

  5. Javascript 中 的坑..

    ### 1. 0 == '' 返回 true 0 === '' 返回false......... 切记...

  6. JavaScript中全局变量和局部变量的不同

    今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结. 大神代码截图+理解文字如下: 解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全 ...

  7. javascript中所谓的“坑”收录

    坑一: // 反例myname = "global"; // 全局变量function func() { alert(myname); // "undefined&quo ...

  8. 坑:JavaScript 中 操作符“==” 和“===” 的区别

    标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...

  9. ajax实现给JavaScript中全局变量赋值(转)

    原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...

随机推荐

  1. Spring Mvc 用Demo去学习

    1:首先大体知道 SpringMVC 框架的 运行原理(图片来自网络 ) 2:SpringMVC 是依照DispatcherServlet 展开的 这里可以约Structs2对比,structs2 是 ...

  2. What does a Bayes factor feel like?(转)

    A Bayes factor (BF) is a statistical index that quantifies the evidence for a hypothesis, compared t ...

  3. source install sshpass in aix

    1.源码下载:   wget https://nchc.dl.sourceforge.net/project/sshpass/sshpass/1.06/sshpass-1.06.tar.gz 2.解压 ...

  4. MD5加密算法(信息摘要算法)、Base64算法

    1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...

  5. Eclipse中如何显示代码行

    方法一 快捷键方式: 按住 Ctrl + F10 选择 show  Line Numbers 方法二 手动操作: Window -- Prefences -- General -- Editors - ...

  6. javacpp-opencv图像处理系列:国内车辆牌照检测识别系统(万份测试车牌识别准确率99.7%以上,单次平均耗时39ms)

    javaCV图像处理系列: 一.javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 二.javaCV图像处理之2:实时视频添 ...

  7. Redis 集群搭建详细指南

    先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...

  8. ios开发 oc 的类方法与对象方法

    --------开始前先申明一下:小编为了让大家看出效果,在编码中命名方式会又些不规范. 首先我们先来了解一下什么是类方法与对象方法. 对象方法: 对象是由“-”开头.比如:-(void)Runner ...

  9. VSTO在幻灯片里面添加按钮对象

    //添加Form窗体,窗体中添加Image控件,单击弹出"PPT"信息提示 //命名引用:using MF = Microsoft.Vbe.Interop.Forms; priva ...

  10. java源码学习(五)LinkedList

    LinkedList [TOC] 一.定义 public class LinkedList<E> extends AbstractSequentialList<E> imple ...