探讨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 相关文章推荐
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
Nov 08 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
javascript正则表达式中分组详解
Jul 17 Javascript
纯js实现倒计时功能
Jan 06 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
TypeScript中条件类型精读与实践记录
Oct 05 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
php不用正则采集速度探究总结
2008/03/24 PHP
php 字符转义 注意事项
2009/05/27 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
php简单的上传类分享
2016/05/15 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
javascript来定义类的规范小结
2010/11/19 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
js canvas实现五子棋小游戏
2021/01/22 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python collections模块使用方法详解
2019/08/28 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
2014自主招生自荐信策略
2014/01/27 职场文书
元宵节寄语大全
2015/02/27 职场文书