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^)/
- JavaScript声明全局变量三种方式的异同javascript
- JavaScript声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- JavaScript中声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- JavaScript声明全局变量三种方式的异同
- JavaScript学习笔记-JavaScript声明全局变量三种方式的异同
- Javascript全局变量的三种声明方式
- 基于JavaScript的三种声明全局变量方式介绍
- 基于JavaScript 声明全局变量的三种方式详解
- JavaScript 声明全局变量的三种方式详解
- 基于JavaScript 声明全局变量的三种方式详解
- 基于JavaScript 声明全局变量的三种方式详解
- JavaScript中声明全局变量的三种方式(包括显示和隐式)
- javascript 函数声明的三种方式
- javascript 没有块级作用域 JavaScript声明全局变量三种方式 及
- JS 声明全局变量的三种方式
- 关于JavaScript脚本中的alert思考javascript
- Javascript与Flash/Flex/SilverLightjavascript
- 企业库 验证模块的 javascript 解决方案javascript
- javascript refresh page 几种页面刷新的方法javascript
- 几款极品的javascript压缩混淆工具javascript
- JavaScript声明全局变量三种方式的异同javascript
- Javascript跳转页面和打开新窗口等方法javascript
- Unity的IOS界面风格插件Igui
- Flex与javascript通信javascript
- 设计了一个JavaScript的源代码混淆器javascript
- 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码javascript
- javascript 基础 转javascript
- 调试Atlas客户端JavaScript脚本javascript
- [JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版javascript