JavaScript开发注意事项

    技术2022-05-19  27

     

    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

    举例:

    if ( myVar === undefined ) { //Do something }

    在上面的例子中,未定义实际上是一变量。所有的JavaScript引擎会创建初始化的变量window.undefined 给未定义作为值。然而注意的是变量不仅是可读,任何其他的代码可以刚改它的值。很奇怪能找到window.undefined 有来自未定义的不同的值的场景,但是为什么冒险呢?

    解决办法:检查未定义时,使用typeof。

    if ( typeof myVar === “undefined” ) { //Do something } 

     

     

     


    最新回复(0)