收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 4870|回复: 16

Javascript命名禁区[110407.updated]

[复制链接]
发表于 2011-4-1 16:58:15 | 显示全部楼层 |阅读模式
通常我们会在一些javascript的书籍上看到,使用Javascript保留字作为标识符(变量名、函数名、循环标记等)时,会引起程序报错!
但如果是有一定经验的前端开发人员,肯定知道在实际应用中,命名禁区不限于这些保留字!!!
没碰到过?那我们从一个例子开始!
Firefox(测试: ff3.6)中运行如下代码:

 提示:您可以先修改部分代码再运行


IE(测试: ie6,ie8)中运行如下代码:

 提示:您可以先修改部分代码再运行



110407添加,引起 Chrome bug( Chrome下运行)

 提示:您可以先修改部分代码再运行


都不是我们预期的效果,有木有??

此类问题,报错还好,如果当时没有报错,而当项目上线后,在某些特定环境下,它才执行异常,这时候来查错才真的要人老命。
SO,我整理了一份“命名禁区”的文档,供自己查询,给大家参考,不必记住它,但至少得有个印象。

一、标识符允许的字符集。
在ECMAScript V3中,标识符除首字母外,允许使用除 (./=?:&#\{}()<>[]|~!’”\*^) 等特殊字符外所有的unicode字符集。

二、变量名、函数名、循环标记命名禁区。
1、保留字

  1. break function return typeof case do if switch var catch else in this void continue false instanceof throw while debugger finally new true with default for null try
复制代码

2、未来保留字

  1. abstract double goto native static boolean enum implements package super byte export import private synchronized char extends int        protected throws class final interface public transient const float long short volatile
复制代码

3、扩展列表

  1. as is namespace [color=DarkOrange]use[/color] arguments encodeURI Infinity Object String Array Error isFinite parseFloat SyntaxError Boolean escape isNaN parseInt TypeError Date eval Math RangeError undefined decodeURI EvalError NaN ReferenceError unescape decodeURIComponent Function Number RegExp URIError
复制代码

4、IE全局变量

  1. status onresize onmessage parent onhashchange defaultStatus name history maxConnectionsPerServer opener location screenLeft document onbeforeprint screenTop clientInformation onerror onfocus event onload onblur window closed screen onscroll length frameElement self onunload onafterprint navigator frames sessionStorage top clipboardData external onhelp offscreenBuffering localStorage onbeforeunload
复制代码

5、FF全局变量

  1. getInterface addEventListener loadFirebugConsole console window cehomepage document netscape XPCSafeJSObjectWrapper XPCNativeWrapper Components sessionStorage globalStorage getComputedStyle dispatchEvent removeEventListener name parent top dump getSelection scrollByLines scrollbars scrollX scrollY scrollTo scrollBy scrollByPages sizeToContent setTimeout setInterval clearTimeout clearInterval setResizable captureEvents releaseEvents routeEvent enableExternalCapture disableExternalCapture open openDialog frames applicationCache self navigator screen history content menubar toolbar locationbar personalbar statusbar directories closed crypto pkcs11 controllers opener status defaultStatus location innerWidth innerHeight outerWidth outerHeight screenX screenY mozInnerScreenX mozInnerScreenY pageXOffset pageYOffset scrollMaxX scrollMaxY length fullScreen alert confirm prompt focus blur back forward home stop print moveTo moveBy resizeTo resizeBy scroll close updateCommands find atob btoa frameElement showModalDialog postMessage localStorage
复制代码

4、5这是最容易被忽视的部分,有的变量允许你重新设置,但最好不要随意去占用它,除非你非常清楚你在干什么,及可能造成的后果


三、属性方法命名禁区。
1、保留字

  1. break delete function return typeof case do if switch var catch else in this void continue false instanceof throw while debugger finally new true with default for null try
复制代码

2、未来保留字

  1. super export import extends const class
复制代码

  1. * 这里主要针对字面量对象{},eg:
  2. var testObj = {class: 3}; //ie将报错
  3. var testObj = {}; testObj['class'] = 3 //则不会
复制代码


原文地址:Javascript命名禁区

[[i] 本帖最后由 CNwander 于 2011-4-7 22:04 编辑 ]
发表于 2011-4-1 17:27:18 | 显示全部楼层
辛苦了,老早就想整理一下,但一直没付之行动,呵呵,就拿LZ这个现成的了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-1 20:58:34 | 显示全部楼层

回复 2# zxbmt 的帖子

嗯,谢谢支持,现在很少有人关注这类问题了
我也是自己多次碰到了这个问题后才下决心整理出来
回复 支持 反对

使用道具 举报

发表于 2011-4-1 21:35:43 | 显示全部楼层

留名

这类问题很少碰到,但是碰到了就会让人很郁闷!
回复 支持 反对

使用道具 举报

发表于 2011-4-2 17:17:20 | 显示全部楼层
我估计每个人曾经都不经意之间写过 document.getElementById('test').class = 'className'
回复 支持 反对

使用道具 举报

发表于 2011-4-2 18:18:25 | 显示全部楼层
这个平时没怎么注意,
回复 支持 反对

使用道具 举报

发表于 2011-4-6 10:44:53 | 显示全部楼层
我们项目组没有这种现象。

因为我为前端定下的编程规范中要求:所有的变量与方法必须由类包装。
这样就杜绝了全局变量或函数的存在(任何一个变量都至少有一个类名作为其Namespace),几乎没人遇到此类现象。
回复 支持 反对

使用道具 举报

发表于 2011-4-6 11:09:51 | 显示全部楼层
很好很强大。谢谢楼主。如果变量都加上自己的标识,应该可以避免这种问题。

[[i] 本帖最后由 chensulong 于 2011-4-6 11:11 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2011-4-6 12:34:28 | 显示全部楼层
好文章. 有劳楼主了。
回复 支持 反对

使用道具 举报

发表于 2011-4-6 13:19:48 | 显示全部楼层
一、标识符允许的字符集。
在ECMAScript V3中,标识符除首字母外,允许使用除 (./=?:&#\{}()<>[]|~!’”\*^) 等特殊字符外所有的unicode字符集。


真的? ~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-7 00:32:10 | 显示全部楼层
原帖由 [i]tangbin1987 于 2011-4-2 17:17 发表
我估计每个人曾经都不经意之间写过 document.getElementById('test').class = 'className'

我不止一次曾犯下这个错误


原帖由 [i]fengchun77415 于 2011-4-6 10:44 发表
我们项目组没有这种现象。

因为我为前端定下的编程规范中要求:所有的变量与方法必须由类包装。
这样就杜绝了全局变量或函数的存在(任何一个变量都至少有一个类名作为其Namespace),几乎没人遇到此类现象。

嗯,再加上 自运行匿名函数 和 元素数据缓存机制 这种命名上的冲突基本上可以避免
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-7 00:34:40 | 显示全部楼层
@xjj2000
记得以前flash区有一个 火山,全部用中文命名,看得我头那个头晕啊
js区好像还没碰到过
回复 支持 反对

使用道具 举报

发表于 2011-4-7 08:26:37 | 显示全部楼层
好文章  辛苦楼主了。新手特来拜访
回复 支持 反对

使用道具 举报

发表于 2011-4-7 09:42:10 | 显示全部楼层
收藏了,这个必须要顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-7 21:05:39 | 显示全部楼层
引起 Chrome bug( Chrome下运行)

 提示:您可以先修改部分代码再运行


[[i] 本帖最后由 CNwander 于 2011-4-7 22:00 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2011-4-11 17:35:04 | 显示全部楼层
谢谢整理,小弟现在正在努力学习JS中
回复 支持 反对

使用道具 举报

发表于 2011-4-26 18:46:15 | 显示全部楼层
楼主的文章挺不错的,现在在学习中挺有帮助的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-11-27 22:14 , Processed in 0.109099 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表