来自Nine Javascript Gotchas, 以下是JavaScript容易犯错的九个陷阱。虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 笔者对某些陷阱会混杂一些评点。

  1. 最后一个逗号

    如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描。

    <script>var theObj = {city : "Boston",state : "MA",}</script> 
  2. this的引用会改变

    如这段代码:

    <input type="button" value="Gotcha!" id="MyButton" ><script>var MyObject = function () {this.alertMessage = "Javascript rules";this.ClickHandler = function() {alert(this.alertMessage );}}();document.getElementById(”theText”).onclick =  MyObject.ClickHandler</script>

    并不如你所愿,答案并不是”JavaScript rules”。在执行MyObject.ClickHandler时,代码中红色这行,this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决:

    <input type="button" value="Gotcha!" id="theText" ><script>var MyObject = function () {var self = this;this.alertMessage = “Javascript rules”;this.OnClick = function() {alert(self.value);}}();document.getElementById(”theText”).onclick =  MyObject.OnClick</script>

    实质上,这就是JavaScript作用域的问题。如果你看过,你会发现解决方案不止一种。

  3. 标识盗贼

    在JavaScript中不要使用跟HTML的id一样的变量名。如下代码:

    <input type="button" id="TheButton"><script>TheButton = get("TheButton");</script>

    IE会报对象未定义的错误。我只能说:IE sucks.

  4. 字符串只替换第一个匹配

    如下代码:

    <script>var fileName = "This is a title".replace(" ","_");</script>

    而实际上,结果是”This_is a title“. 在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样:

    var fileName = "This is a title".replace(/ /g,"_");
  5. mouseout意味着mousein

    事实上,这是由于事件冒泡导致的。IE中有mouseentermouseleave,但不是标准的。作者在此建议大家使用库比如YUI来解决问题。

  6. parseInt是基于进制体系的

    这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt("09"),如果你认为答案是9,那就错了。因为,在此,字符串以0开头,parseInt以八进制来处理它,在八进制中,09是非法,返回false,布尔值false转化成数值就是0. 因此,正确的做法是parseInt("09", 10).

  7. for...in...会遍历所有的东西

    有一段这样的代码:

    var arr = [5,10,15]var total = 1;for ( var x in arr) {total = total * arr[x];}

    运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Arrayprototype,这样,我们的arr平白无过多出了一个属性(方法),而for...in...会把它给遍历出来。所以这样做才是比较安全的:

    for ( var x = 0; x < arr.length; x++) {total = total * arr[x];}

    其实,这也是污染基本类的prototype会带来危害的一个例证。

  8. 事件处理器的陷阱

    这其实只会存在使用作为对象属性的事件处理器才会存在的问题。比如window.onclick = MyOnClickMethod这样的代码,这会复写掉之前的window.onclick事件,还可能导致IE的内容泄露(sucks again)。在IE还没有支持DOM 2的事件注册之前,作者建议使用库来解决问题,比如使用YUI:

    YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);

    这应该也属于常识问题,但新手可能容易犯错。

  9. Focus Pocus

    新建一个input文本元素,然后把焦点挪到它上面,按理说,这样的代码应该很自然:

    var newInput = document.createElement("input");document.body.appendChild(newInput);newInput.focus();newInput.select();

    但是IE会报错(sucks again and again)。理由可能是当你执行fouce()的时候,元素尚未可用。因此,我们可以延迟执行:

    var newInput = document.createElement("input");newInput.id = "TheNewInput";document.body.appendChild(newInput);setTimeout(function(){ //这里我使用闭包改写过,若有兴趣可以对比原文document.getElementById('TheNewInput').focus();document.getElementById('TheNewInput').select();}, 10);

在实践中,JavaScript的陷阱还有很多很多,大多是由于解析器的实现不到位而引起。这些东西一般都不会在教科书中出现,只能靠开发者之间的经验分享。谢天谢地,我们生活在网络时代,很多碰到的问题,一般都可以在Google中找到答案。

转自 Realazy » JavaScript的9个陷阱及评点

JavaScript的9个陷阱及评点相关推荐

  1. [js点滴(转)]JavaScript中的this陷阱的最全收集--没有之一

    当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解释 ...

  2. 16.JavaScript函数、return陷阱、函数定义、参数传递、默认参数、局部变量、全局变量、返回值、技巧

    文章目录 函数 函数的定义 局部变量 外部变量 内外变量重名 参数 参数默认值 年长代码的默认参数 空值合并运算符的应用 返回值 return陷阱 小技巧 函数 在编程过程中,我们经常需要在很多地方使 ...

  3. JavaScript中的小陷阱(不定期更新。。)

    1. var scores = [1, 2, 3]; var total = 0; for (var score in scores) {total += score; }var mean = tot ...

  4. JS setTimeout延迟时间为0的详解

    本篇文章来源于 麦客教程网(学吧频道) 原文链接:http://x8.maicoo.com/tech/javascript/17387.html, wordoor.com 由 John Resig 的 ...

  5. JavaScript 反混淆的一般套路和技巧[起][承][转][结]

    https://www.blackglory.me/javascript-deobfuscate-general-routines-and-tips-chapter-1/ 最近发现网上没有什么专门深入 ...

  6. excel数据透视表_无痛的方式隐藏Excel数据透视表项

    excel数据透视表 If you're working with an Excel 2007 pivot table, you might want to temporarily hide one ...

  7. 前端网站资源精编!!

    前端网站资源精编!! 目录: 1-------- 走进前端 2-------- jQuery 3-------- CSS 4-------- Angularjs 5-------- ES6 6---- ...

  8. 各大网站,欢迎大家收藏转发

    人整理来之不易请珍惜,如有错误请谅解,谢谢... 资源教程: 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2. ...

  9. 最全前端资源---快过来 最新鲜的资源这里都有

    如果您阅读之后,感觉有缺失:麻烦您告诉我 我进行补充.谢谢 综合类 综合类 地址 前端知识体系 前端知识体系 - naniJser - 博客园 前端知识结构 https://github.com/Ja ...

最新文章

  1. 【转】Flex4:利用HttpService与ASP.NET传输JSON数据(登录为例)
  2. Win 11大更新:可安装超千款Android应用
  3. 子组件自动执行方法_【自动化程序的最佳实践】 04 自动化程序的生命周期
  4. visual studio创建项目时需要注意的问题
  5. C++smallest circle 获取外接给定点集的最小圆的中心和半径算法(附完整源码)
  6. leetcode跳跃游戏C语言,LeetCode:跳跃游戏
  7. IDEA如何在包下建立子包
  8. 光凭 5G 根本无法解决宽带问题!
  9. 微信小程序源码:淘宝客外卖返利优惠券、头像 壁纸 朋友圈文案查询、古诗词技术文章查询
  10. 【渝粤教育】电大中专学前教育学_1作业 题库
  11. 方维直播3.1最新搭建文档《0》-原创
  12. 【Kubernetes 015】pod调度之Affinity亲和性
  13. django之csrf_exempt解决跨域请求的问题
  14. 计算机专硕日语考研学校排名,日语考研院校排名(日语专硕学校排名)
  15. linux 高效压缩工具xz的压缩和解压使用
  16. java向量加法_结构-03. 平面向量加法(10) java
  17. python代码运行速度有点慢 ? 教你使用多线程速度飞升
  18. 【SpringMVC】拦截器和过滤器
  19. 多项式与快速傅立叶变换
  20. k8s 部署 Atlas

热门文章

  1. SliverLight注册字典转换器方法
  2. 预发布环境,Tag发布机制和可重复的部署过程
  3. Java事务处理类(源码)
  4. 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)
  5. poj2752 字符串子KMP应用
  6. @Conditional 和 @ConditionalOnProperty
  7. SQL Server 游标的使用示例
  8. TP5 自带分页类的传参
  9. node执行cmd命令方法
  10. [iOS]图片高清度太高, 导致内存过大Crash