JavaScript代码的编写细节
1. 给父节点绑定事件,而不是每一个子节点。delegate 方法; 2. 对要进行操作元素隐藏,构造好DOM结构,加入在show处理。 3. 减少直接对dom节点的多次操作。document.createDocumentFragment 4. 减少全局变量的重复引用: function createChildFor(elementId){ var doc = document, //store in a local variable element = doc.getElementById(elementId), newElement = doc.createElement("div"); element.appendChild(newElement); } //用一个临时变量存放。 var c = _global.a.b.c; 5. IE6 中,数组join('') 操作优于大量字符串+操作。 6. 尽量减少css样式出现在js的代码里面。更改样式,请用定义class来代替,只针对class操作。 例如: element.style.color = "red"; element.style.left = "10px"; element.style.top = "100px"; element.style.visibility = "visible"; or element.style.cssText = "color: red; left: 10px; top: 100px; visibility: hidden"; 方案:.reveal {color: red;left: 10px;top: 100px;visibility: visible;} 7. 分离事件监听函数、事件处理函数。不传递不必要的event对象: var MyApplication = { handleClick: function(event) { this.showPopup(event.clientX, event.clientY); }, //这里函数的处理逻辑,只是跟参数值有关,不应该牵扯到UI关联的Event事件。 showPopup: function(x, y) { var popup = document.getElementById("popup"); popup.style.left = x + "px"; popup.style.top = y + "px"; } }; // 这里只是定义了事件的处理函数,真正的处理逻辑不要同时写到这里。 addListener(element, "click", function(event) { MyApplication.handleClick(event); // this is okay }); //如此一来,重用showPopup 函数就成为了可能: MyApplication.showPopup(10, 10); 8. 关于属性(不是属性值)存在判断, if(typeof obj.a){} // wrong. if(obj.a){} // wrong. if(obj.a != null){} // wrong. if(obj.a != undefined){} // wrong. //为什么?假如: var obj = { a: null, b:0, c:"",d:undefined}; //事实上,上述的判断都是值判断,不合我们的要求。正确的判断: if("a" in obj){} //true // 或者是 if(obj.hasOwnProperty("a")){} //true // 注意:对于IE6/7/8, DOMElement 对象是不会继承 js原生对象Object的hasOwnProperty方法。 9. 不要重写原生对象、方法,包括直接扩展方法。 事实上,因为这些对象、方法都不是你来维护的,它们的更新超出你的控制。 一种替代方法是门面设计模式——把原生的东西包起来,例如jQuery对象。 Array.prototype.index = function(){} // 不赞成 /** * @param arr {Array} 数组对象 */ function MyArray(arr){ this.arr = arr; } MyArray.prototype.index = function(){}; var myArray = new MyArray([...]); myArray.index() ECMAScript 5草案中新增了对象的加锁,可以从根本上防止这一类错误的。 内容来自:《Maintainable JavaScript》
相关推荐
Kakoola 2020-08-01
honeyth 2020-09-13
mjshldcsd 2020-08-15
Ping 2020-08-15
Yellowpython 2020-08-01
chenguangchun 2020-07-26
dailinqing 2020-07-18
xiaouncle 2020-07-05
delmarks 2020-06-28
MayerF 2020-06-14
MrHaoNan 2020-06-13
smalllove 2020-06-09
JayFighting 2020-06-08
xiaoge00 2020-06-07
haokele 2020-05-31
matthewhan 2020-05-25
Alanxz 2020-05-20
82550495 2020-05-19