All*_*nde 49 javascript anti-patterns
我发现不做的事情比学习应该做的更难学习.
根据我的经验,专家和中间人之间的区别在于能够从各种看似相同的方式中做出相同的选择.
那么,谈到JavaScript,你应该做什么样的事情以及为什么?
我能够为Java找到很多这些,但由于JavaScript的典型上下文(在浏览器中)与Java非常不同,我很想知道它会发生什么.
ann*_*ata 46
语言:
命名空间通过在全局上下文中创建大量变量来进行污染.
绑定事件处理程序的形式为'foo.onclick = myFunc'(不可扩展,应该使用attachEvent/addEventListener).
几乎在任何非JSON上下文中使用eval
几乎每次使用document.write(使用像document.createElement这样的DOM方法)
针对Object对象的原型设计(BOOM!)
这是一个小的,但用'+'做大量的字符串连接(创建一个数组并加入它更有效)
参考不存在的undefined常数
设计/部署:
(通常)不提供noscript支持.
不将您的代码打包到单个资源中
将内联(即主体)脚本放在主体顶部附近(它们阻止加载)
特定于Ajax:
不指示对用户的请求的开始,结束或错误
轮询
传递和解析XML而不是JSON或HTML(如果适用)
编辑:我一直在想更多!
Tri*_*ych 19
除了那些已经提到的......
使用for..in构造迭代数组
(迭代数组方法和索引)
使用Javascript内联<body onload="doThis();">
(不灵活并防止多个事件侦听器)
使用'Function()'构造函数
(由于同样的原因eval()很糟糕)
将字符串而不是函数传递给setTimeout或setInterval
(也在eval()内部使用)
不使用分号依赖隐式语句
(不良习惯可以拾取,并可能导致意外行为)
使用/*..*/来阻挡的代码行
(可以使用正则表达式文字干扰,例如:/* /.*/ */)
<福音传道>当然,不使用原型;)</福音传道>
Rak*_*Pai 11
对我来说最大的不是理解JavaScript编程语言本身.
然后是浏览器运行时的那些:
最后是部署问题.
<plug>我有一些客户端优化技巧,涵盖了我上面提到的一些事情,以及更多,在我的博客上.</ plug>
另请参阅Crockford的"Javascript:The Good Parts",以避免各种其他事情.(编辑:警告,他在他的一些建议中有点严格,比如使用"==="而不是"=="所以带上任何粒子的盐为你工作)
一些事情就在我的头顶.当我想到更多时,我会编辑这个列表.
任何使用'与'
with(document.forms ["mainForm"].elements){
input1.value ="junk";
input2.value ="垃圾"; }
任何提及
document.all
Run Code Online (Sandbox Code Playgroud)
在你的代码中,除非它在特殊代码中,只是为了IE来克服IE错误.(咳嗽 document.getElementById()咳嗽)
由于自动插入分号,您应该始终在语句后面放置一个大括号。
例如这个:
function()
{
return
{
price: 10
}
}
Run Code Online (Sandbox Code Playgroud)
与此有很大不同:
function(){
return{
price: 10
}
}
Run Code Online (Sandbox Code Playgroud)
因为在第一个示例中,javascript 会为您插入一个分号,实际上留下的是:
function()
{
return; // oh dear!
{
price: 10
}
}
Run Code Online (Sandbox Code Playgroud)
对于需要重复执行某些操作的场合,应该使用 setTimeout 而不是 setInterval。
如果您使用 setInterval,但在计时器下一次滴答时,计时器中执行的函数尚未完成,这很糟糕。相反,使用 setTimeout 使用以下模式
function doThisManyTimes(){
alert("It's happening again!");
}
(function repeat(){
doThisManyTimes();
setTimeout(repeat, 500);
})();
Run Code Online (Sandbox Code Playgroud)
Paul Irish在我从 jQuery 源视频中学到的 10 件事中对此进行了很好的解释