JavaScript的9个陷阱及评点(3)
作者:Realazy 来源:Realazy 发布时间:2007-08-28 15:10:00
标签:JavaScript,陷阱
7. for...in...会遍历所有的东西
有一段这样的代码:
var arr = [5,10,15]
var total = 1;
for ( var x in arr) {
total = total * arr[x];
}
运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN, 晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype,这样,我们的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中找到答案。
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 具体内容如下所示:参考案例:import turtled=0for i in range(4): turtle.fd(200)
- 本文实例为大家分享了JS实现简易计算器的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html>
- 我们经常会遇到多重查询问题,而长长的SQL语句往往让人丈二和尚摸不着头脑。特别是客户端部分填入查询条件时,如用普通方法将更是难上加难。以下巧
- 下面就是简单的例子,这里提供2中方法:test.htm &
- Win8.1下安装Python3.6提示0x80240017错误,如何解决?定位原因缺少Windows补丁KB2999226解决方法到Mic
- 叨叨几句哈喽兄弟们,今天实现一下人脸识别。先问大家一个问题什么是百度Aip模块?百度AI平台提供了很多的API接口供开发者快速的调用运用在项
- 一、merge函数用途pandas中的merge()函数类似于SQL中join的用法,可以将不同数据集依照某些字段(属性)进行合并操作,得到
- chat.html <html> <head><title>asp之家-简单聊天&l
- 问题一:python启动报错api-ms-win-crt-process-l1-1-0.dll 丢失解决:下载api-ms-win-crt-
- 1. 编码问题:遇到了几个字符串转换问题,总结如下:# str to bytes str.encode(s)# bytes to str b
- 例子:http.Handle("/tmpfiles/", http.StripPrefix("/tmpfile
- Django url pathDjango 路由在 urls.py 配置path('浏览器地址栏表示URL', '处
- 1。帐号和口令设置 要选择用户SYS、SYSTEM、DBSNMP、SYSMAN使用相同的口令,那就选择“所有账户使用同一口令”。 BI用户,
- 在讲样式表开发管理之前,我想插播一个小知识。前几天看web标准设计组里,看到龍佑康同学问到关于 block 和 inline 的区别。记得以
- 前言在学校太闲,就写了这个程序,可以绘制函数图像,并且可以绘制其导函数图像和不定积分的图像,效果非常不错。效果图说明1,程序无法绘制复数图像
- 引 言前提:以下讨论的前提 是设置MySQL的crash safe相关参数为双1:sync_binlog=1innodb_flush_log
- 绘制动图FuncAnimation,它的使用要求简洁且定制化程度较高。如果想将很多图片合并为一个动图,那么ArtistAnimation是最
- 本文实例为大家分享了python微信好友删除的具体代码,供大家参考,具体内容如下#weixin.py#coding:utf-8# !/usr
- # -*- coding: utf8 -*-'''Created on 2013-12-19@author: goo
- SUBSTR函数是用来截取数据库某一列字段中的一部分。 在各个数据库的函数名称不一样(真是蛋疼,后发明的数据库难道不能同先发明的一样吗?)