探讨JavaScript中声明全局变量三种方式的异同


Posted in Javascript onDecember 03, 2013

变量及变量声明是一门语言最基本的概念,初学者都会很快掌握。JavaScript中声明变量也是如此,很简单var(关键字)+变量名(标识符)。

方式1

var test;
var test = 5;需注意的是该句不能包含在function内,否则是局部变量。这是第一种方式声明全局变量。

方式2

test = 5;
没有使用var,直接给标识符test赋值,这样会隐式的声明了全局变量test。即使该语句是在一个function内,当该function被执行后test变成了全局变量。

方式3

window.test;
window.test = 5;这种方式经常被用到一个匿名函数执行后将一些函数公开到全局。 如JQuery1.5中最末一句

window.jQuery = window.$ = jQuery;

如果只是使用变量test,那么三种方式将没有什么区别。比如:alert(test) 都将显示5。但三种方式在某些情况下还是有区别的。分别按以上三种方式声明三个变量a1,a2,a3。

a1 = 11;
var a2 = 22;
window.a3 = 33;

1,for in window

for(a in window){
 if(a=='a1'||a=='a2'||a=='a3'){
  alert(a)
 }
}
IE6/7/8/9:只弹出了a3,说明通过第一,二种方式声明的全局变量通过for in window时将获取不到。
Firefox/Chrome/Safari/Opera :a1,a2,a3都弹出了,说明三种方式声明的全局变量,通过for in window时都能获取到。

2,delete

try {
 alert(delete a1);
}catch(e){alert('无法delete a1')}

try{
 alert(delete a2);
}catch(e){alert('无法delete a2')}

try{
 alert(delete a3);
}catch(e){alert('无法delete a3')}

结果如下

探讨JavaScript中声明全局变量三种方式的异同

可以看到,
1,delete a2所有浏览器都是false。即通过var声明的变量无法删除,所有浏览器表现一致。这在犀牛书上也有提到。

2,通过window.a3方式声明的全局变量在IE6/7/8中均无法删除,IE9/Firefox/Chrome/Safari/Opera中却可以。

虽然有以上两点不同,但当用in运算时,都返回true。

alert('a1' in window);//true
alert('a2' in window);//true
alert('a3' in window);//true
用with打开对象window闭包时,所有浏览器也表现一致,如下

with(window){
 if(a1){
  alert(a1);//11
 }
 if(a2){
  alert(a2);//22
 }
 if(a3){
  alert(a3);//33
 } 
}

Javascript 相关文章推荐
jquery ready函数源代码研究
Dec 06 Javascript
url地址自动加#号问题说明
Aug 21 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
JavaScript常用标签和方法总结
Sep 01 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
Oct 01 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
Dec 12 Javascript
如何从零开始手写Koa2框架
Mar 22 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 #Javascript
解析Javascript小括号“()”的多义性
Dec 03 #Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 #Javascript
jquery将一个表单序列化为一个对象的方法
Dec 02 #Javascript
jQuery获得内容和属性方法及示例
Dec 02 #Javascript
jquery如何实现锚点链接之间的平滑滚动
Dec 02 #Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 #Javascript
You might like
德劲1103二次变频版的打磨
2021/03/02 无线电
安装APACHE
2007/01/15 PHP
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
独特的python循环语句
2016/11/20 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
精伦电子Java笔试题
2013/01/16 面试题
在职人员函授期间自我评价分享
2013/11/08 职场文书
销售经理岗位职责
2014/03/16 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
自荐信格式模板
2015/03/27 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书