举例:
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();
举例:
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);
举例:
if ( myVar === undefined ) { //Do something }
在上面的例子中,未定义实际上是一变量。所有的JavaScript引擎会创建初始化的变量window.undefined 给未定义作为值。然而注意的是变量不仅是可读,任何其他的代码可以刚改它的值。很奇怪能找到window.undefined 有来自未定义的不同的值的场景,但是为什么冒险呢?
解决办法:检查未定义时,使用typeof。
if ( typeof myVar === “undefined” ) { //Do something }