JavaScript声明全局变量三种方式的异同javascript

来源:互联网 发布:http请求返回数据不全 编辑:程序博客网 时间:2024/05/17 11:58

评论

2123084

#1楼

2011-03-19 18:50

yzx226

学习了

回复 引用 查看

#2楼

2011-03-19 22:54

gray zhang

var test = 3; // 这种其实创建的是一个variable

test = 3; // 这种其实是在global下创建一个property

window.test = 3; // 同上一种,但通用性不好,不在浏览器环境下会出问题

所以比较正统的符合ecma的应该是global.test = 3;

但是一般来说global是访问不到的,那么就得想办法弄出来

按ecmav3的标准来说,正常调用一个函数的话,其内部的this就是global,所以这么写

var global = (function() { return this; }());

但是ecmav5又出了一个strict模式,在该模式下,如果正常调用一个函数,其内部的this是undefined

好在ecmav5里又有indirect eval call,这在你的另一篇中有提到过,indirect eval call永远在global下执行,所以那个时候的this就是global了

var global = (1,eval)('(this)');

所以综合一下,获取global的方法是:

var global = (function() { return this || (1,eval)('(this)'); }());

再随后global.tes = 3;就安全了

回复 引用 查看

#3楼

2011-03-19 22:55

gray zhang

相关的一些资料:http://perfectionkills.com/unnecessarily-comprehensive-look-into-a-rather-insignificant-issue-of-global-objects-creation/

回复 引用 查看

#4楼

2011-03-19 23:37

franky

引用var test = 3; // 这种其实创建的是一个variable

test = 3; // 这种其实是在global下创建一个property

这两种都是在variableobject上添加一个属性.区别是一个具备可删除特性,一个不具备这个特性.

不过早期的firefox,大概是2之前的版本,有一个实现上的bug.多某个标识符赋值,可能会发生特性上的修改,比如本来具备不可删除特性的,变量,会因为赋值运算,导致该属性的 不可删除特性被去掉.

对于获取global这个事, gray zhang,已经开始考虑严格模式了?

另外楼主提到的 ie下in 和 for in 的区别,确实是ie实现上的bug.

引用用with打开对象window闭包时,所有浏览器也表现一致,如下

我个人对这个with打开闭包的说法,持反对态度. 我认为爱民大哥,之所以在其语言精髓与编程实践中有这一说发,源自于当时他对闭包概念的错误理解. 所以这一说法是不恰当的.

回复 引用 查看

#5楼

2011-03-19 23:54

gray zhang

@franky

strict模式其实很多思想蛮合理的,比如不要不使用var来定义全局变量,以及不要随意删除属性等

而且使用firefox 4.0的话,其console在strict模式下会报出不少的warning可以便于检查代码

所以我现在写js一般是先加上'use strict',到上线的时候再去掉的

回复 引用 查看

#6楼

2011-03-20 00:05

franky

引用gray zhang:

@franky

strict模式其实很多思想蛮合理的,比如不要不使用var来定义全局变量,以及不要随意删除属性等

而且使用firefox 4.0的话,其console在strict模式下会报出不少的warning可以便于检查代码

所以我现在写js一般是先加上'use strict',到上线的时候再去掉的

恩,我始终觉得edition5是个过渡产物. 我对这一版本,毁誉参半. 尤其是严格模式.可能我在说老道太个人主观化的去制定edition5的同时,自己也太主观了些.是该更加开放的去接受的时候了.

回复 引用 查看

#7楼[楼主]

2011-03-20 19:07

snandy

@franky

@gray zhang

你们俩的讨论使我一天都在思考,查看相关资料。而没有匆忙回复。谢谢你们。真想拥抱下!o(∩_∩)o~

回复 引用 查看

#8楼

2011-03-20 20:03

franky

呵呵,经过讨论,甚至是争论,大家都能对知识,有重新的认识.楼主不要怪罪,我总来吹毛求疵就好.

回复 引用 查看

#9楼

2011-03-21 09:40

真爱无悔

多谢分享。

回复 引用 查看

#10楼[楼主]

2011-03-21 09:42

snandy

@franky

教主客气了。是有点找到知音的感觉。

回复 引用 查看

#11楼

2011-06-11 22:20

kanoe

楼主,我在ie9和chrome试了

var a2 = 22;

try{

alert(delete a2);}

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

结果都是true?

回复 引用 查看


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击