仿JQuery输写高效JSLite代码的一些技巧


Posted in Javascript onJanuary 13, 2015

讨论jQuery和javascript性能的文章并不罕见。然而,我计划根据他人对jQuery总结的一些速度方面的技巧和一些建议,来教你提升你的JSLite和javascript代码。好的代码会带来速度的提升。快速渲染和响应意味着更好的用户体验。

首先,在脑子里牢牢记住JSLite就是javascript。这意味着我们应该采取相同的编码惯例,风格指南和最佳实践。

首先,如果你是一个javascript新手,没有用过jQuery我建议您阅读最好先阅读官方文档的语法介绍,这是一篇高质量的javascript教程,表示您已经会jQuery用过一段时间了。

当你准备使用JSLite,我强烈建议你遵循下面这些指南:

缓存变量

DOM遍历是昂贵的,所以尽量将会重用的元素缓存。

// 糟糕

h = $('#element').height();

$('#element').css('height',h-20);

// 建议

$element = $('#element');

h = $element.height();

$element.css('height',h-20);

避免全局变量

JSLite与javascript一样,一般来说,最好确保你的变量在函数作用域内。

// 糟糕

$element = $('#element');

h = $element.height();

$element.css('height',h-20);

// 建议

var $element = $('#element');

var h = $element.height();

$element.css('height',h-20);

使用匈牙利命名法

在变量前加$前缀,便于识别出JSLite对象。

// 糟糕

var first = $('#first');

var second = $('#second');

var value = $first.val();

// 建议 - 在JSLite对象前加$前缀

var $first = $('#first');

var $second = $('#second'),

var value = $first.val();

使用 var 链(单 var 模式)

将多条var语句合并为一条语句,我建议将未赋值的变量放到后面。

var $first = $('#first'),

    $second = $('#second'),

    value = $first.val(),

    k = 3,

    cookiestring = 'SOMECOOKIESPLEASE',

    i,

    j,

    myArray = {};

请使用 on

在新版JSLite中,更短的 on("click") 用来取代类似 click() 这样的函数。在之前的版本中 on() 就是 bind() 。 on()附加事件处理程序的首选方法。然而,出于一致性考虑,你可以简单的全部使用 on() 方法。

// 糟糕

$first.click(function(){

    $first.css('border','1px solid red');

    $first.css('color','blue');

});
$first.hover(function(){

    $first.css('border','1px solid red');

})

// 建议

$first.on('click',function(){

    $first.css('border','1px solid red');

    $first.css('color','blue');

})
$first.on('hover',function(){

    $first.css('border','1px solid red');

})

精简javascript

一般来说,最好尽可能合并函数。

// 糟糕

$first.click(function(){

    $first.css('border','1px solid red');

    $first.css('color','blue');

});

// 建议

$first.on('click',function(){

    $first.css({

        'border':'1px solid red',

        'color':'blue'

    });

});

链式操作

JSLite实现方法的链式操作是非常容易的。下面利用这一点。

// 糟糕

$second.html(value);

$second.on('click',function(){

    alert('hello everybody');

});

$second.fadeIn('slow');

$second.animate({height:'120px'},500);

// 建议

$second.html(value);

$second.on('click',function(){

    alert('hello everybody');

}).fadeIn('slow').animate({height:'120px'},500);

维持代码的可读性

伴随着精简代码和使用链式的同时,可能带来代码的难以阅读。添加缩紧和换行能起到很好的效果。

// 糟糕

$second.html(value);

$second.on('click',function(){

    alert('hello everybody');

}).fadeIn('slow').animate({height:'120px'},500);

// 建议

$second.html(value);

$second

    .on('click',function(){ alert('hello everybody');})

    .fadeIn('slow')

    .animate({height:'120px'},500);

选择短路求值

短路求值是一个从左到右求值的表达式,用 &&(逻辑与)或 || (逻辑或)操作符。

// 糟糕

function initVar($myVar) {

    if(!$myVar) {

        $myVar = $('#selector');

    }

}

// 建议

function initVar($myVar) {

    $myVar = $myVar || $('#selector');

}

选择捷径

精简代码的其中一种方式是利用编码捷径。

// 糟糕

if(collection.length > 0){..}

// 建议

if(collection.length){..}

繁重的操作中分离元素

如果你打算对DOM元素做大量操作(连续设置多个属性或css样式),建议首先分离元素然后在添加。

// 糟糕

var 

    $container = $("#container"),

    $containerLi = $("#container li"),

    $element = null;
$element = $containerLi.first(); 

//... 许多复杂的操作

// better

var 

    $container = $("#container"),

    $containerLi = $container.find("li"),

    $element = null;
$element = $containerLi.first().detach(); 

//... 许多复杂的操作

$container.append($element);

熟记技巧

你可能对使用JSLite中的方法缺少经验,一定要查看的文档,可能会有一个更好或更快的方法来使用它。

// 糟糕

$('#id').data(key,value);

// 建议 (高效)

$.data('#id',key,value);

使用子查询缓存的父元素

正如前面所提到的,DOM遍历是一项昂贵的操作。典型做法是缓存父元素并在选择子元素时重用这些缓存元素。

// 糟糕

var 

    $container = $('#container'),

    $containerLi = $('#container li'),

    $containerLiSpan = $('#container li span');

// 建议 (高效)

var 

    $container = $('#container '),

    $containerLi = $container.find('li'),

    $containerLiSpan= $containerLi.find('span');

避免通用选择符

将通用选择符放到后代选择符中,性能非常糟糕。

// 糟糕

$('.container > *'); 

// 建议

$('.container').children();

避免隐式通用选择符

通用选择符有时是隐式的,不容易发现。

// 糟糕

$('.someclass :radio'); 

// 建议

$('.someclass input:radio');

优化选择符

例如,Id选择符应该是唯一的,所以没有必要添加额外的选择符。

// 糟糕

$('div#myid'); 

$('div#footer a.myLink');

// 建议

$('#myid');

$('#footer .myLink');

避免多个ID选择符

在此强调,ID 选择符应该是唯一的,不需要添加额外的选择符,更不需要多个后代ID选择符。

// 糟糕

$('#outer #inner'); 

// 建议

$('#inner');

坚持最新版本

新版本通常更好:更轻量级,更高效,方法更多,更全面的覆盖jQuery方法。显然,你需要考虑你要支持的代码的兼容性。例如,项目是否跑在良好的支持 HTML5/CSS3

必要时组合JSLite和javascript原生代码

如上所述,JSLite就是javascript,这意味着用JSLite能做的事情,同样可以用原生代码来做。原生代码的可读性和可维护性可能不如JSLite,而且代码更长。但也意味着更高效(通常更接近底层代码可读性越差,性能越高,例如:汇编,当然需要更强大的人才可以)。牢记没有任何框架能比原生代码更小,更轻,更高效(注:测试链接已失效,可上网搜索测试代码)。

最后忠告

最后,我记录这篇文章的目的是提高JSLite的性能和其他一些好的建议。如果你想深入的研究对这个话题你会发现很多乐趣。记住,JSLite并非不可或缺,仅是一种选择。思考为什么要使用它。DOM操作?ajax?模版?css动画?还是选择器?jQuery重度开发者?

Javascript 相关文章推荐
jQuery+CSS 实现的超Sexy下拉菜单
Jan 17 Javascript
jQuery使用正则表达式限制文本框只能输入数字
Jun 18 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
vue实现验证码按钮倒计时功能
Apr 10 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
Jun 14 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
手把手15分钟搭一个企业级脚手架
Sep 16 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
优化Vue中date format的性能详解
Jan 13 Javascript
javascript实现简单页面倒计时
Mar 02 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 #Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 #Javascript
jquery删除指定子元素代码实例
Jan 13 #Javascript
JavaScript删除指定子元素代码实例
Jan 13 #Javascript
JS长整型精度问题实例分析
Jan 13 #Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
Jan 13 #Javascript
javascript面向对象之定义成员方法实例分析
Jan 13 #Javascript
You might like
PHP服务器页面间跳转实现方法
2012/08/02 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
基于jquery的cookie的用法
2011/01/10 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
vue2配置scss的方法步骤
2019/06/06 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
python数据结构之二叉树的遍历实例
2014/04/29 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
《卖木雕的少年》教学反思
2014/04/11 职场文书
新闻编辑专业自荐信
2014/07/02 职场文书
运动会报道稿300字
2014/10/02 职场文书
员工离职证明范本
2015/06/12 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
Redis高并发缓存架构性能优化
2022/05/15 Redis