ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:19.09KB ,
资源ID:6963347      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6963347.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(开发者最容易犯的13个JavaScript错误.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

开发者最容易犯的13个JavaScript错误.docx

1、开发者最容易犯的13个JavaScript错误开发者最容易犯的13个JavaScript错误开发者最容易犯的JavaScript错误,总结出13个。这些当中可能少不了你犯的错误。我们描述了这些陋习,并列出来解决办法,希望对开发者有帮助。1.for.in数组迭代的用法 Usage of for.in to iterate Arrays举例:1 var myArray = “a”, “b”, “c” ; 2 var totalElements = myArray.length; 3 for (var i = 0; i totalElements; i+) 4 console.log(myArray

2、i); 5 这里主要的问题是语句中的“for.in”不能保证顺序,这意味着你将获得不同的执行结果。此外,如果有人增加一些其他自定义功能的函数Array.prototype,你的循环将重复遍历这些函数,就像原数组项。解决办法:一直使用规则的for.in循环来遍历数组。6 var myArray = “a”, “b”, “c” ; 7 for (var i=0; imyArray.length; i+) 8 console.log(myArrayi); 9 2.Array dimensions举例10 var myArray = new Array(10); 第二个问题是开发者使用数组构成器来创建

3、数组,技术上是正确的,然而会比文字符号(literal notation)。解决办法:使用文字符号来初始化数组,不要预定义数组长度。var myArray = ;3.Undefined properties举例:11 var myObject = 12 someProperty: “value”, 13 someOtherProperty: undefined 14 未定义属性,将在对象中创建元素(键someOtherProperty和值undefined.)。如果你遍历数组,检测已存在的元素,那么下面的语句将都返回“未定义/undefined”typeof myObjectsomeOther

4、Property / undefined typeof myObjectunknownProperty / undefined 解决办法:如果你想明确声明对象中的未初始化的属性,标记它们为Null。15 var myObject = 16 someProperty: “value”, 17 someOtherProperty: null 18 4.Misuse of Closures举例:19 function(a, b, c) 20 var d = 10; 21 var element = document.getElementById(myID); 22 element.onclick =

5、 (function(a, b, c, d) 23 return function() 24 alert (a + b + c + d); 25 26 )(a, b, c, d); 27 这里开发者使用两个函数来传递参数a、b、c到onclick handler。双函数根本不需要,徒增代码的复杂性。变量abc已经在局部函数中被定义,因为他们已经在主函数中作为参数被声明。局部函数中的任何函数都可创建主函数中定义的所有变量的闭包。因此不需要再次传递它们。看看这里JavaScript Closures FAQ 了解更多。解决办法:使用闭合来简化代码。28 function (a, b, c) 29

6、var d = 10; 30 var element = document.getElementById(myID); 31 element.onclick = function() 32 /a, b, and c come from the outer function arguments. 33 /d come from the outer function variable declarations. 34 /and all of them are in my closure 35 alert (a + b + c + d); 36 ; 37 5.Closures in loops举例:

7、38 var elements = document.getElementByTagName(div); 39 for (var i = 0; ielements.length; i+) 40 elementsi.onclick = function() 41 alert(“Div number “ + i); 42 43 在这里例子里面,当用户点击不同的divs时,我们想触发一个动作(显示“Div number 1”, “Div number 2” 等) 。然而,如果你在页面有10个divs,他们全部都会显示“Div number 10”。问题是当我们使用局部函数创建一个闭包时,函数中的代码

8、可以访问变量i。关键是函数内部i和函数外部i涉及同样的变量。当我们的循环结束,i指向了值10,所以局部函数中的i的值将是10。解决办法:使用第二函数来传递正确的值。44 var elements = document.getElementsByTagName(div); 45 for (var i = 0; ielements.length; i+) 46 elementsi.onclick = (function(idx) /Outer function 47 return function() /Inner function 48 alert(“Div number “ + idx); 4

9、9 50 )(i); 51 6.Memory leaks with DOM objects举例:52 function attachEvents() 53 var element = document.getElementById(myID); 54 element.onclick = function() 55 alert(“Element clicked”); 56 57 ; 58 attachEvents(); 该代码创建了一个引用循环。变量元素包含函数的引用(归于onclick属性)。同时,函数保持一个DOM元素的引用(提示函数内部可以访问元素,因为闭包。)。所以JavaScript垃

10、圾收集器不能清除元素或是函数,因为他们被相互引用。大部分的JavaScript引擎对于清除循环应用都不够聪明。解决办法:避免那些闭包,或者不去做函数内的循环引用。59 function attachEvents() 60 var element = document.getElementById(myID); 61 element.onclick = function() 62 /Remove element, so function can be collected by GC 63 delete element; 64 alert(“Element clicked”); 65 66 ; 6

11、7 attachEvents(); 7.区别整数数字和浮点数字Differentiate float numbers from integer numbers举例:68 var myNumber = 3.5; 69 var myResult = 3.5 + 1.0; /We use .0 to keep the result as float 在JavaScript中,浮点与整数间没有区别。事实上,JavaScript中的每个数字都表示使用双精度64位格式IEEE 754。简单理解,所有数字都是浮点。解决办法:不要使用小数(decimals),转换数字(numbers)到浮点(floats)。

12、70 var myNumber = 3.5; 71 var myResult = 3.5 + 1; /Result is 4.5, as expected 8.Usage of with() as a shortcut举例:72 team.attackers.myWarrior = attack: 1, speed: 3, magic: 5; 73 with (team.attackers.myWarrior) 74 console.log ( “Your warrior power is ” + (attack * speed); 75 讨论with()之前,要明白JavaScript co

13、ntexts如何工作的。每个函数都有一个执行context(语句),简单来说,包括函数可以访问的所有的变量。因此context包含arguments和定义变量。with()真正是做什么?是插入对象到context链,它在当前context和父级context间植入。就像你看到的with()的快捷方式会非常慢。解决办法:不要使用with() for shortcuts,仅for context injection,如果你确实需要时。76 team.attackers.myWarrior = attack: 1, speed: 3, magic: 5; 77 var sc = team.attac

14、kers.myWarrior; 78 console.log(“Your warrior power is ” + (sc.attack * sc.speed); 9.setTimeout/setInterval 字符串的用法 (Usage of strings with setTimeout/setInterval)举例:79 function log1() console.log(document.location); 80 function log2(arg) console.log(arg); 81 var myValue = “test”; 82 setTimeout(“log1()

15、”, 100); 83 setTimeout(“log2(” + myValue + “)”, 200); setTimeout()和setInterval()可被或一个函数或一个字符串作为首个参数。如果你传递一个字符串,引擎将创建一个新函数(使用函数构造器),这在一些浏览器中会非常慢。相反,传递函数本身作为首个参数,更快、更强大、更干净。解决办法:一定不要使用strings for setTimeout()或setInterval()。84 function log1() console.log(document.location); 85 function log2(arg) consol

16、e.log(arg); 86 var myValue = “test”; 87 setTimeout(log1, 100); /Reference to a function 88 setTimeout(function() /Get arg value using closures 89 log2(arg); 90 , 200); 10.setInterval()的用法(Usage of setInterval() for heavy functions)举例:91 function domOperations() 92 /Heavy DOM operations, takes about

17、300ms 93 94 setInterval(domOperations, 200); setInterval()将一函数列入计划被执行,仅是在没有另外一个执行在主执行队列中等待。如果在队列中没有另外一个执行,JavaScript引擎将在下一个队列中执行。这可能导致跳过执行或者运行2个不同的执行,没有在它们之间等待200ms的情况下。一定要搞清,setInterval()没有考虑进多长时间domOperations()来完成任务。解决办法:避免 setInterval(),使用 setTimeout()95 function domOperations() 96 /Heavy DOM ope

18、rations, takes about 300ms 97 /After all the job is done, set another timeout for 200 ms 98 setTimeout(domOperations, 200); 99 100 setTimeout(domOperations, 200); 11.Misuse of this这个常用错误,没有例子,因为非常难创建来演示。this的值在JavaScript中与其他语言有很大的不同。函数中的this值被定义是在当函数被调用时,而非声明的时间,这一点非常重要。下面的案例中,函数内this有不同的含义。* Regula

19、r function: myFunction(arg1);this points to the global object, wich is window for all browers.* Method: someObject.myFunction(arg1);this points to object before the dot, someObject in this case.* Constructor: var something = new myFunction(arg1);this points to an empty Object.* Using call()/apply():

20、 myFunction.call(someObject, arg1);this points to the object passed as first argument.12.eval()访问动态属性的用法Usage of eval() to access dynamic properties举例:101 var myObject = p1: 1, p2: 2, p3: 3; 102 var i = 2; 103 var myResult = eval(myObject.p+i); 主要问题在于使用eval()开始一个新的执行语句,会非常的慢。解决办法:使用方括号表示法(square bra

21、cket notation)代替 eval()。104 var myObject = p1: 1, p2: 2, p3: 3; 105 var i = 2; 106 var myResult = myObject“p”+i; 13.未定义(undefined)作为变量的用法Usage of undefined as a variable举例:107 if ( myVar = undefined ) 108 /Do something 109 在上面的例子中,未定义实际上是一变量。所有的JavaScript引擎会创建初始化的变量window.undefined给未定义作为值。然而注意的是变量不仅是可读,任何其他的代码可以更改它的值。很奇怪能找到window.undefined用来未定义的不同值的场景,但是为什么冒险呢?解决办法:检查未定义时,使用typeof。110 if ( typeof myVar = “undefined” ) 111 /Do something 112

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1