JavaScript中的坑--全局变量惹得祸
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中的坑--全局变量惹得祸的更多相关文章
- JavaScript中局部变量与全局变量的不同
JavaScript中局部变量与全局变量 我们知道,JavaScript的变量是松散型的变量,也就是说,其变量只需用var声明,其赋值的类型是不限定的.比如: var person=18; perso ...
- JavaScript中的坑
内容:关于JavaScript中的一些蛋疼的问题以及面试笔试中常见的一些坑爹套路总结 此部分内容持续总结完善中... 1.undefined和null的区别 null: Null类型,代表空值,代表一 ...
- 对JavaScript中局部变量、全局变量和闭包的理解
对js中局部变量.全局变量和闭包的理解 局部变量 对于局部变量,js给出的定义是这样的:在 JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域 ...
- javascript 中event是全局变量
The only thing I can think of is that event is in fact window.event and it makes itself available wh ...
- Javascript 中 的坑..
### 1. 0 == '' 返回 true 0 === '' 返回false......... 切记...
- JavaScript中全局变量和局部变量的不同
今天看到大神写得一片文章,自己对全局变量和局部变量的理解还是不够深刻,因此写到这篇文章,做个总结. 大神代码截图+理解文字如下: 解析:上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全 ...
- javascript中所谓的“坑”收录
坑一: // 反例myname = "global"; // 全局变量function func() { alert(myname); // "undefined&quo ...
- 坑:JavaScript 中 操作符“==” 和“===” 的区别
标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...
- ajax实现给JavaScript中全局变量赋值(转)
原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...
随机推荐
- SmartCoder每日站立会议06
站立会议内容 讨论了小程序的具体实现方式,主要会加入地图这一元素,使程序看起来更加的方便直观,同时也会使人感到新颖.在对各个点的评论对话功能也在考虑中. 1. 站立会议照片: 2.任务展板 3.燃尽图
- AtomicInteger的使用
JDK API 1.7相关介绍 可以用原子方式更新的 int 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.AtomicInteger 可用在应用 ...
- Centos7下安装部署MXNET
Centos下安装MXNET,参考官方文档http://mxnet.io/get_started/setup.html#prerequisites, 一.安装python的mxnet步骤如下: #!/ ...
- 【面向对象设计原则】之接口隔离原则(ISP)
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看 ...
- Qt之添加图标
导读: 在使用Qt Creator编写完应用程序后,设置release版的应用程序图标着实困扰了不少的人.一个漂亮的图标是一个软件的脸,没有一个漂亮的图标,那么这个程序是不完整的.那么我们来看看如何设 ...
- linux切换g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50(优先级) sudo update-alternative ...
- 影响国内WinCE7发展的最大障碍是没有D版下载
WinCE红火的时代已经过去,做嵌入式系统时考虑WinCE的越来越少,网络上相关文章也是越来越少. 但真正用过WinCE的应该有体会,它集成了文件系统,tcp/ip,GUI系统,usb驱动,就这些,你 ...
- 干货 | 云智慧透视宝Java代码性能监控实现原理
这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,做一手好菜的男神老公的大作,曾发表于技术公号,经本人授权转载~~ 一.Java ...
- SpringMVC form:form的一个错误(没有传到前台绑定类)
SpringMVC form:form的一个错误(没有传到前台绑定类) 报错信息: Neither BindingResult nor plain target object for bean nam ...
- 常用数组、字符串方法总结&获取元素、DOM操作
字符串的方法.返回值.是否改变原字符串:1 charAt() 方法可返回指定位置的字符. 不改变原始字符串 JavaScript并没有一种有别于字符串类型的字符数据类型,返回的字符是长度为 1 的字符 ...