我发现不该做的事情比应该做的事情更难学。
根据我的经验,专家与中级的区别在于能够从各种看似等效的方式中进行选择,以做同样的事情。
那么,当涉及到 JavaScript 时,哪些事情不应该做,为什么?
我可以为 Java 找到很多这样的内容,但由于 JavaScript 的典型上下文(在浏览器中)与 Java 非常不同,我很想知道结果如何。
我发现不该做的事情比应该做的事情更难学。
根据我的经验,专家与中级的区别在于能够从各种看似等效的方式中进行选择,以做同样的事情。
那么,当涉及到 JavaScript 时,哪些事情不应该做,为什么?
我可以为 Java 找到很多这样的内容,但由于 JavaScript 的典型上下文(在浏览器中)与 Java 非常不同,我很想知道结果如何。
语:
通过在全局上下文中创建大量变量来污染命名空间。
以 'foo.onclick = myFunc' 形式绑定事件处理程序(不可扩展,应使用 attachEvent/addEventListener)。
在几乎所有非 JSON 上下文中使用 eval
几乎每次使用 document.write(使用像 document.createElement 这样的 DOM 方法)
针对 Object 对象进行原型设计(BOOM!)
一个很小的,但是用'+'做大量的字符串连接(创建一个数组并加入它更有效)
参考不存在的undefined
常数
设计/部署:
(通常)不提供 noscript 支持。
不将您的代码打包到单个资源中
将内联(即正文)脚本放在正文顶部附近(它们会阻止加载)
特定于 Ajax:
不向用户指示请求的开始、结束或错误
轮询
传递和解析 XML 而不是 JSON 或 HTML(在适当的情况下)
其中许多来自 Addy Osmati 的《学习 JavaScript 设计》一书:https ://www.oreilly.com/library/view/learning-javascript-design/9781449334840/ch06.html
编辑:我一直在想更多!
除了已经提到的那些...
使用for..in
构造迭代数组
(迭代数组方法和索引)
使用类似 Javascript 的内联<body onload="doThis();">
(不灵活并阻止多个事件侦听器)
使用 'Function()' 构造函数
(出于同样的原因eval()
不好是不好的)
将字符串而不是函数传递给setTimeout
or setInterval
(也在eval()
内部使用)
通过不使用分号来依赖隐式语句
(养成的坏习惯,并可能导致意外行为)
使用 /* .. */ 阻止代码行
(可能会干扰正则表达式文字,例如/* /.*/ */
:)
<evangelism> 当然,不使用 Prototype ;) </evangelism>
对我来说最大的问题是不了解 JavaScript 编程语言本身。
然后是浏览器运行时的那些:
最后是部署问题。
<plug> 我的博客上有一些客户端优化技巧,涵盖了我上面提到的一些内容,以及更多内容。</plug>
另请参阅 Crockford 的“Javascript: The Good Parts”以了解其他各种要避免的事情。(编辑:警告,他的一些建议有点严格,比如使用“===”而不是“==”所以把它们和任何对你有用的盐一起服用)
有几件事就在我的头上。当我想到更多时,我会编辑这个列表。
任何使用'with'
with (document.forms["mainForm"].elements) {
input1.value = "junk";
input2.value = "垃圾"; }
任何参考
document.all
在您的代码中,除非它在特殊代码中,否则只是为了让 IE 克服 IE 错误。(咳嗽文档.getElementById()咳嗽)
由于自动分号插入,您应该始终在语句后放置一个大括号。
例如这个:
function()
{
return
{
price: 10
}
}
与此有很大不同:
function(){
return{
price: 10
}
}
因为在第一个例子中,javascript 会为你插入一个分号,实际上给你留下了这个:
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 件事
不使用基于社区的框架来执行重复性任务,例如 DOM 操作、事件处理等。
很少进行有效的缓存: