javascript的一些最佳实践

一、缓存需要多次读取的 DOM元素,对象属性,数组值

var obj = { arr: [1, 2, 3] };
A:
for (var i = 0; i < obj.arr.length; i++) {
    document.getElementById("Grid" + obj.arr[i]).Condition = ‘‘;
    document.getElementById("Grid" + obj.arr[i]).DataBand();
}

B:
var arr = obj.arr,
    i = 0,
    len = arr.length,
    item = null;

for (; i < len; i++) {
    item = arr[i];
    var grid = document.getElementById("Grid" + item);
    grid.Condition = ‘‘;
    grid.DataBand();
}

二、尽量缩小DOM元素查询范围

有如下DOM结构
<body>
    <ul id="ul">
        <li>a</li>
        <li class=‘li‘>b</li>
        <li>c</li>
    </ul>
    ……
</body>
使用$(‘#ul‘).find(‘.li‘)替代$(‘.li‘)
注:现代浏览器都实现了getElementByClassName,querySelector和querySelectorAll,class选择器的速度只比id选择器稍慢,但是针对低版本的IE浏览器,速度差距很大。

三、减少页面回流(reflow)

重绘(repaint):当一个元素只有外观发生改变,但不影响布局。主要为以下样式:visibility,outline,visibility, background-color。
回流(reflow):当一个元素发生改变的时候,导致文档流中的其他元素变动。一个元素的回流导致了其所有子元素以及DOM中紧随其后的祖先元素的随后的回流。
有如下DOM结构
<body>
    <div>
        <p id="p1">1</p>
        <p>2</p>
        <p>3</p>
    </div>
    ……
</body>
修改p1的的高度,会导致
1.p1的高度变化
2.p1后面的p元素定位变化
3.父容器高度变化
4.重复以上过程。

常见导致回流的操作:
1.添加删除可见DOM元素。
2.修改DOM元素的可见性,位置,大小,内容。
3.浏览器将 reflow 放进一个队列,达到一定程度或时限就进行操作,但是在读取以下属性时,会强制提交relow操作
[offset|scroll|client][Top|Left|Width|Height], getComputedStyle(),currentStyle(IE)

回流是无法避免的,但是可以尽量避免:
1.一次性添加元素,事先拼接好html代码,使用innterHTML插入或者使用DocumentFragment添加。
2.尽量通过className或者cssText一次性修改元素的样式,或者将元素删除/隐藏,处理完成之后再加回到文档中。
3.针对上面提到到Layout属性值,事先缓存,避免每次读取属性时造成浏览器的渲染。
4.设置元素的position为absolute或fixed,使元素从文档流中脱离,浏览器只需要渲染该元素 以及位于该元素下方的元素,动画方面尤其值得考虑。

四、使用事件委托替代事件绑定。

针对列表和表格的事件绑定,可以利用冒泡的原理,将事件绑定到父级上。
<ul id="ul">
  <li>a</li>
  <li>b</li>
  <li>c</li>
</ul>
A:
$(‘#ul‘).find(‘li‘).click(function(){

});

B:
$(‘#ul‘).delegate(‘li‘,‘click‘,function(){

});

五、其他

1.使用原生js代码替代jquery

$checkeboxs.each(function () {
    var checked = $(this).prop(‘checked‘);
    var checked = this.checked;
});
了解原生js,才能更好的使用其他框架和库。
2.针对耗时js操作,使用setTimeout定时释放UI线程,防止浏览器假死
function processArray(items, process) {
    if (items && items.length){
        var todo = items.concat();
        (function () {
            var start = new Date();
            do {
                process(todo.shift());
            }
            while (todo.length && (new Date() - start < 100));
            if (todo.length) {
                setTimeout(arguments.callee, 25);
            }
        })();
    }
}
3.尽量避免全局变量
4.使用jslint/jshite 检查代码
5.参考书籍《高性能JavaScript》
时间: 2024-08-08 07:09:37

javascript的一些最佳实践的相关文章

Javascript继承的最佳实践

什么是继承? 继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 在Javascript 中 没有 类的概念, 它是通过构造函数来产生 对象, 构造函数 就是一个普通的函数,通常当函数名 为 大写开头的,我们认为是构造函数,否则 就是普通的方法. function A() { this.name = 'A Class instance'; } function m1() { } 既然 Javascript 是 通过构造函数来产生

超实用的JavaScript技巧及最佳实践

众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现,比如NodeJS.Wakanda以及其它实现.此外,许多开发者都会把JavaScript选为入门语言,使用它来做一些弹出窗口等小东西. 在这篇文章中,作者将会向大家分享JavaScript开发的小技巧.最佳实践等非常实用的内容,不管你是前端开发者还是服务端开发者,都应该来看看这些小技巧,它们绝对会

【转】超实用的JavaScript技巧及最佳实践

众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现,比如NodeJS.Wakanda以及其它实现.此外,许多开发者都会把JavaScript选为入门语言,使用它来做一些弹出窗口等小东西. 在这篇文章中,作者将会向大家分享JavaScript开发的小技巧.最佳实践等非常实用的内容,不管你是前端开发者还是服务端开发者,都应该来看看这些小技巧,它们绝对会

Javascript继承之最佳实践

尊重原创,转载请注明出处:http://blog.csdn.net/zoutongyuan 什么是继承? 继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 在Javascript 中 没有 类的概念, 它是通过构造函数来产生 对象, 构造函数 就是一个普通的函数.通常当函数名 为 大写开头的.我们觉得是构造函数,否则 就是普通的方法. function A() { this.name = 'A Class instance';

超实用的JavaScript技巧及最佳实践(下)

文中所提供的代码片段都已经过最新版的Chrome 30测试,该浏览器使用V8 JavaScript引擎(V8 3.20.17.15). 1.使用逻辑符号&&或者||进行条件判断 1 2 3 var foo = 10;   foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething();  foo == 5 || doSomething(); // is the same thi

201508181508_《JavaScript单例模式的最佳实践(摘自汤姆大叔)》

var SingletonTester = (function () { //参数:传递给单例的一个参数集合 function Singleton(args) { //设置args变量为接收的参数或者为空(如果没有提供的话) var args = args || {}; //设置name参数 this.name = 'SingletonTester'; //设置pointX的值 this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值 //设置po

45个实用的JavaScript技巧、窍门和最佳实践

如你所知,JavaScript是世界上第一的编程语言,它是Web的语言,是移动混合应用(mobile hybrid apps)的语言(比如PhoneGap或者Appcelerator),是服务器端的语言(比如NodeJS或者Wakanda),并且拥有很多其他的实现.同时它也是很多新手的启蒙语言,因为它不但可以在浏览器上显示一个简单的alert信息,而且还可以用来控制一个机器人(使用nodebot,或者nodruino).掌握JavaScript并且能够写出组织规范并性能高效的代码的开发人员,已经

实用的JavaScript技巧、窍门和最佳实践

1 – 在第一次给一个变量赋值的时候不要忘记使用var关键字 给一个未定义的变量赋值会导致创建一个全局变量.要避免全局变量. 2 – 使用===,而不是== ==(或!=)操作符在需要的时候会自动执行类型转换.===(或!==)操作不会执行任何转换.它将比较值和类型,而且在速度上也被认为优于==. 1 2 3 4 5 6 7 8 [10] === 10    // is false [10]  == 10    // is true '10' == 10     // is true '10'

【译】JavaScript 创建对象: 方法一览与最佳实践

本文是我在众成翻译上认领并翻译的:JavaScript 创建对象: 方法一览与最佳实践 在JavaScript中“创建对象”是一个复杂的话题.这门语言提供了很多种创建对象的方式,不论新手还是老手都可能对此感到无所适从,不知道应该选择哪一种.不过,尽管创建对象的方法很多,看上去语法差异也很大,但实际上它们的相似性可能比你所以为的要多.本文将带领你踏上一段梳理对象创建方法的旅程,为你揭示不同方法之间的依赖与递进关系. 对象字面量 我们的第一站毫无疑问就是创建对象最简单的方法,对象字面量.JavaSc