专栏首页游戏杂谈全局变量的三种声明方法

全局变量的三种声明方法

全局变量有如下三种声明方法(这里以举声明FWK这个变量为例):

1、使用var直接声明  var FWK;

2、使用window.FWK = ….;

3、隐式声明全局变量(定义FWK前不加var) FWK

它们的区别在哪里呢?更提倡何种写法?

使用var 定义的变量,将被提前预解析,如下的代码:

<script type="text/javascript">
alert(FWK);

FWK	= 'ddd';
</script> 
<script type="text/javascript">
alert(FWK);

window.FWK	= 'ddd';
</script> 
<script type="text/javascript">
alert(FWK);

var FWK	= 'ddd';
</script>
其它的二种声明方法,将会被告知FWK未定义(FWK is not defined)
看看这三种声明的方式,是否能被for in出来:
<script type="text/javascript">
window.FWK = 'ddd';

for (var i in window) {
	if (i === 'FWK') {
		alert(i + '---' + window[i]);
	}	
}
</script>
<script type="text/javascript">
FWK	= 'ddd';

for (var i in window) {
	if (i === 'FWK') {
		alert(i + '---' + window[i]);
	}	
}
</script>
<script type="text/javascript">
var FWK	= 'ddd';

for (var i in window) {
	if (i === 'FWK') {
		alert(i + '---' + window[i]);
	}	
}
</script>

除了window.FWK的方式能被for in 出来,其它二种均不行。

再看看它们是否能被delete:

<script type="text/javascript">
var FWK	= 'ddd';

alert(	delete FWK	);

alert(FWK);
</script>

显示false ddd,说明var 声明的变量无法使用delete

<script type="text/javascript">
FWK	= 'ddd';

alert(	delete FWK	);

alert(FWK);
</script>

显示true FWK未定义,说明隐式声明的全局变量可以被delete,与global对象的parseInt、escape、parseFloat等等类似,可直接被delete。

<script type="text/javascript">
alert(parseInt);
alert(delete parseInt);
alert(parseInt);
</script>
<script type="text/javascript">
window.FWK	= 'ddd';

alert(	delete FWK	);
alert(FWK);
</script>

IE下会提示

,其它浏览器Chrome、FireFox可以被删除,表现上与隐式声明的变量一致。

但IE下为何会提示对象不支持此操作呢?

根据《Javascript编程精髓和编程实践》中的说明,IE的Javascript引擎来自ActiveScript系统,而window对象来自浏览器的DOM系统,所以在IE中window.x使用delete类似于下面的操作:

<script type="text/javascript">
var div = document.createElement("div");

div.x = 'ddd';

alert(delete div.x);
</script>

当然是不可以了,而其它浏览器它们的Javascript引擎不像IE这么复杂,所以并不会出现此问题。

既然提到了delete操作符,那就再深入一点 :)

使用eval直接声明的var变量可以被delete

<script type="text/javascript">
eval('var FWK = "abc";');

alert(FWK);

alert(delete FWK);

alert(FWK);
</script>

其中eval本身就属于Global对象,但对于eval代码中的函数内通过var声明的变量却不能被delete。如下:

<script type="text/javascript">
var k = eval("(function() { var FWK = 42; alert(delete FWK); return FWK; })();")

alert(k);
</script>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript检测flash player的版本号

    meteoric
  • 让Chrome崩溃的代码

    这是实际项目中,遇到了chrome崩溃掉之后,分析代码抽离出来的那部分“有问题”的代码:

    meteoric
  • Nginx中的PHP缓冲问题

    按代码理解似乎应该是每过1秒钟,将输出一个数字,从10~1 (运行时间>10ms)

    meteoric
  • 受控组件表单&不受控组件

    表单里面的数据 根据State确定 在 HTML 中,表单元素如 <input>,<textarea> 和 <select>表单元素通常保持自己的状态,并根据...

    河湾欢儿
  • 手写Promise A+ 规范

    TimothyJia
  • 轻松学Pytorch – 年龄与性别预测

    大家好,上周太忙,没有更新Pytorch轻松学系列文章,但是我还是会坚定的继续走下去的,所谓有始有终,这个系列我会一直坚持写下去,希望大家继续支持我,积极给我反...

    OpenCV学堂
  • Vue

    通过前面的介绍,我们对目前的项目工程化有了大体了了解,那么其中,在第二阶段的工程化演进中,有一个重要的工程设计理念诞生,他就是著名的 MVC 设计模式,简单点,...

    jinghong
  • Python 强化训练: 第一篇

    谢伟
  • jQuery原理(DOM操作相关方法)

    删除所有的元素或指定元素。判断是否传入参数,如果传入参数,则删除指定元素,否则删除全部。

    Dreamy.TZK
  • js写插件教程

    连小壮

扫码关注云+社区

领取腾讯云代金券