el.onclick = function () {??} return el; } init(); 可以替换为: function init() {
var el = document.getElementById('MyElement'); el.onclick = function () {??} try{ return el; } finally { el = null; } } init();
2) 构造新的context 例如:
function init() {
var el = document.getElementById('MyElement'); el.onclick = function () {??} } init(); 可以替换为:
function elClickHandler() {??} function init() {
var el = document.getElementById('MyElement'); el.onclick = elClickHandler; } init();
把function抽到新的context中,这样,function的context就不包含对el的引用,从而打断循环引用。
3.6.9.2 通过javascript创建的dom对象,必须append到页面中
IE下,脚本创建的dom对象,如果没有append到页面中,刷新页面,这部分内存是不
24
上海天缘迪柯信息技术有限公司
会回收的!
示例代码:
function create () {
var gc = document.getElementById('GC'); for (var i = 0; i < 5000 ; i++) {
var el = document.createElement('div'); el.innerHTML = \
//下面这句可以注释掉,看看浏览器在任务管理器中,点击按钮然后刷新后的内存变化 gc.appendChild(el); } }
3.6.9.3 释放dom元素占用的内存
将dom元素的innerHTML设置为空字符串,可以释放其子元素占用的内存。
在rich应用中,用户也许会在一个页面上停留很长时间,可以使用该方法释放积累得越来越多的dom元素使用的内存。
3.6.9.4 释放javascript对象
在rich应用中,随着实例化对象数量的增加,内存消耗会越来越大。所以应当及时释放对对象的引用,让GC能够回收这些内存控件。
对象:obj = null
对象属性:delete obj.myproperty
数组item:使用数组的splice方法释放数组中不用的item
3.6.9.5 避免string的隐式装箱
对string的方法调用,比如'xxx'.length,浏览器会进行一个隐式的装箱操作,将字符串先转换成一个String对象。推荐对声明有可能使用String实例方法的字符串时,采用如下写法:
var myString = new String('Hello World');
25
3.6.10 性能的其它注意事项
3.6.10.1 尽量使用原生方法 3.6.10.2 switch语句相对if较快
通过将case语句按照归可能到最不可能的顺序进行组织
3.6.10.3 位运算较快
当进行数字运算时,位运算操作要比任何布尔运算或者算数运算快 3.6.10.4
例如:
function eventHandler (e) { if(!e) e = window.event; }
可以替换为:
function eventHandler (e) { e = e || window.event; } 例如: if (myobj) { doSomething(myobj); }
可以替换为:
myobj && doSomething(myobj);
巧用||和&&布尔运算符
3.7 部署
? 用JSLint运行JavaScript验证器来确保没有语法错误或者是代码没有潜在的
26
上海天缘迪柯信息技术有限公司
问
? 部署之前推荐使用压缩工具将JS文件压缩 ? 文件编码统一用UTF-8
3.7.1 JavaScript引用:
JavaScript 程序应该尽量放在 .js 的文件中,需要调用的时候在 HTML 中以