1.DOM对象的内测泄漏 Memory leaks with DOM objects
举例:
function attachEvents() {
var element = document.getElementById(‘myID’);
element.onclick = function() {
alert(“Element clicked”);
}
};
attachEvents();
该代码创建了一个引用循环。变量元素包含函数的引用(归于onclick属性)。同时,函数保持一个DOM元素的引用(提示函数内部可以访问元素, 因为闭包。)。所以JavaScript垃圾收集器不能清除元素或是函数,因为他们被相互引用。大部分的JavaScript引擎对于清除循环应用都不够 聪明。
解决办法:避免那些闭包,或者不去做函数内的循环引用。
function attachEvents() {
var element = document.getElementById(‘myID’);
element.onclick = function() {
//Remove element, so function can be collected by GC
delete element;
alert(“Element clicked”);
}
};
attachEvents();
2.setTimeout/setInterval 字符串的用法 Usage of strings with setTimeout/setInterval
举例:
function log1() { console.log(document.location); }
function log2(arg) { console.log(arg); }
var myValue = “test”;
setTimeout(“log1()”, 100);
setTimeout(“log2(” + myValue + “)”, 200);
setTimeout() 和 setInterval() 可被或一个函数或一个字符串作为首个参数。如果你传递一个字符串,引擎将创建一个新函数(使用函数构造器),这在一些浏览器中会非常慢。相反,传递函数本身作为首个参数,更快、更强大、更干净。
解决办法: 一定不要使用 strings for setTimeout() 或 setInterval()。
function log1() { console.log(document.location); }
function log2(arg) { console.log(arg); }
var myValue = “test”;
setTimeout(log1, 100); //Reference to a function
setTimeout(function(){ //Get arg value using closures
log2(arg);
}, 200);
3. 未定义(undefined)作为变量的用法 Usage of undefined as a variable
举例:
在上面的例子中,未定义实际上是一变量。所有的JavaScript引擎会创建初始化的变量window.undefined 给未定义作为值。然而注意的是变量不仅是可读,任何其他的代码可以刚改它的值。很奇怪能找到window.undefined 有来自未定义的不同的值的场景,但是为什么冒险呢?
解决办法:检查未定义时,使用typeof。