我发现不应该做什么比应该做什么更难学。
根据我的经验,专家和初级者之间的差别在于能否从各种看似相等的方法中选择出最佳的。
那么,当涉及到JavaScript时应该避免哪些事情,以及为什么?
我能够找到很多关于Java的这些内容,但由于JavaScript的典型上下文(在浏览器中)与Java非常不同,因此我很想看看会发生什么。
我发现不应该做什么比应该做什么更难学。
根据我的经验,专家和初级者之间的差别在于能否从各种看似相等的方法中选择出最佳的。
那么,当涉及到JavaScript时应该避免哪些事情,以及为什么?
我能够找到很多关于Java的这些内容,但由于JavaScript的典型上下文(在浏览器中)与Java非常不同,因此我很想看看会发生什么。
语言:
通过在全局上下文中创建大量变量来污染命名空间。
以 'foo.onclick = myFunc' 的形式绑定事件处理程序(不可扩展,应使用attachEvent / addEventListener)。
在几乎任何非 JSON 上下文中使用eval
几乎每种使用document.write的方法(请使用DOM方法如document.createElement)
针对Object对象进行原型设计(BOOM!)
虽然很少,但是使用'+'进行大量的字符串连接(创建数组并将其合并效率更高)
引用不存在的undefined
常量
设计/部署:
(通常)不提供无脚本支持。
未将代码打包为单个资源
将内联脚本(即body)放置在顶部(它们会阻塞加载)
Ajax 特定:
未向用户指示请求的开始、结束或错误状态
轮询
传递和解析 XML 而不是 JSON 或 HTML(在适当的情况下)
其中许多内容来自Addy Osmati的《学习JavaScript设计》一书:https://www.oreilly.com/library/view/learning-javascript-design/9781449334840/ch06.html
编辑:我还在想更多!
使用 for..in
结构来迭代数组
(遍历数组方法和索引)
像 <body onload="doThis();">
这样在 JavaScript 中嵌入代码
(不灵活且无法添加多个事件监听器)
使用 'Function()' 构造函数
(与 eval()
相同的原因使其不好)
将字符串传递给 setTimeout
或 setInterval
而不是函数
(内部也使用了 eval()
)
通过不使用分号来依赖隐式语句
(养成不好的习惯,可能导致意外行为)
使用 /* .. */ 来注释代码行
(可能会干扰正则表达式字面量,例如:/* /.*/ */
)
<evangelism> 当然,不使用 Prototype ;) </evangelism>
对我来说最大的问题不是理解 JavaScript 编程语言本身。
接下来是一些针对浏览器运行时的建议:
最后是部署问题:
<插入广告> 我在我的博客上有一些涵盖了我上面提到的一些内容以及更多内容的客户端性能优化技巧</插入广告>
另请参阅Crockford的《JavaScript: The Good Parts》,了解其他需要避免的内容。(编辑:警告,他在某些建议中有点严格,例如使用“===”而非“==”,因此根据自己的情况接受建议)
以下是我能想到的一些事情。如果我想到更多,我会编辑这个列表。
'with' 的任何使用
with (document.forms["mainForm"].elements) {
input1.value = "垃圾";
input2.value = "垃圾"; }
由于自动分号插入,您应该始终在语句后放置大括号。
例如:
function()
{
return
{
price: 10
}
}
与此大不相同:
function(){
return{
price: 10
}
}
function()
{
return; // oh dear!
{
price: 10
}
}
在需要重复执行某些操作的情况下,应该使用setTimeout而不是setInterval。
如果使用setInterval,但是计时器中执行的函数在计时器下一次触发之前未完成,那么这是不好的。相反,应该使用以下模式使用setTimeout。
function doThisManyTimes(){
alert("It's happening again!");
}
(function repeat(){
doThisManyTimes();
setTimeout(repeat, 500);
})();
这个非常好地解释了,Paul Irish 在他的 从jQuery源码中学到的10件事 视频中讲得非常清楚。
document.all
不使用基于社区的框架来执行重复性任务,如DOM操作、事件处理等。
有效的缓存很少被执行: