- 1、本文档共53页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浅谈 JavaScript 性能优化
龙刚 (@RainoXu)TaobaoUED
优化 JavaScript 性能,使它运行足够快一个关键因素:运行的时间
响应时间与用户的体验
0.1s
用户觉得很流畅
1.0s
用户的操作可能偶尔受到影响,并且用户已经能感觉到有些不流畅
10s
对用户的影响比较严重,需要相应的进度提示。用户也会有一些沮丧
What To Do How To Do?
管理作用域
操作数据
流控制
Reflow
DOM操作
长时间运行的脚本处理
管理作用域
function add(num1, num2){
return num1 + num2;
}
var result = add(5, 10);
使用局部变量
局部变量存在于活动对象中,解析器只需查找作用域中的单个对象
var a = 1;
function test(){
//对变量a进行一系列操作
}
function test2(){
var a = 1;
//对变量a进行一系列操作
}
另一个例子
(function(win, S, undefined) {
...
...
var doc = win[document], loc = location,
EMPTY = ,
...
...
})(window, KISSY);
数据操作
使用局部变量,它是最快的缓存频繁使用的对象、数组及相关的属性值
比访问更快,访问属性的速度,与其在对象中的深度有关
“ . ”操作的次数直接影响着访问对象属性的耗时
var objName = ;
KISSY.add(switchable, function(S, undefined) {
var DOM = S.DOM, Event = S.Event,
...
...
});
function process(data){
if (data. count 0){
for(var i = 0; i data.count; i++){
processData(data.item[i]);
}
}
}
function process(data){
var count = data.count;
if (count 0){
for(var i = 0; i count ; i++){
processData(data.item[i]);
}
}
}
NodeList
不直接操作NodeList,将其转换成静态数组后再使用
方法:
Atotype.slice.call() = 标准浏览器
逐个拷贝到一个新数组中 = For IE
大部分JS库都有提供将Array-Like的对象转变成Array的方法(如KISSY提供的makeArray()方法);部分JS库在返回元素集合时,已预处理成Array(例子:YUI的DOM相关操作方法)
遍历NodeList时,不做对当前NodeList相关结构有影响的DOM操作,并且如之前所提到的,要缓存一些频繁使用到的属性值,以避免杯具发生。
var divs = document.getElementsByTagName(DIV);
//假定页面中有div,所以divs.length是大于0的
for (var idx = 0; idx divs.length; idx++){
document.body.appendChild(
//杯具悄然而置
document.createElement(DIV)
);
(divs.length);
}
杯具的原因?
通过getElementsByTagName()获取得到的是一个Live NodeList的引用,任何对其相关的DOM操作都会立即反应在这个NodeList上面
通过不断地往document.body下插入div 节点,for循环的终止条件( div.length也随之改变)失效,陷入死循环。
Live NodeList vs Static NodeList
理论上,静态的东西应该是最快的,但是实际情况是,Live NodeList更快。
Live NodeList vs Static NodeList
原因:目前市场上的浏览器,对Live NodeList做了缓存
Live NodeList vs Static NodeList
结论:优先使用Live NodeList,通过选择器获取以后,再进一步转换成数组来使用。这也是目前许多JS库在使用的方案。
DOM操作
指明操作DOM的context
YUI:
Array getElementsByCla
您可能关注的文档
最近下载
- 2021全国一卷生物.docx
- 普法先进个人优秀事迹普法先进个人事迹材料三篇.docx
- 2015石油工程专业职业生涯规划.doc VIP
- 中医妇科常见病诊疗指南.pdf VIP
- 微波技术习题答案1.pdf VIP
- 毕业职业生涯规划书PPT模板.pptx
- 22G101三维立体彩色图集完整ppt版本.pptx
- ISO 4649-2017-09-硫化橡胶或热塑性橡胶 — 耐磨性能的测定(旋转辊筒式磨耗机法)(中文版 ).docx
- T∕CAGHP 031-2018 地质灾害危险性评估及咨询评估预算标准(试行)(可复制版).pdf
- CECS195-2006聚合物水泥、渗透结晶型防水材料应用技术规程(OCR).pdf
文档评论(0)