10CommonJavaScriptBugsandHowtoFixthem原文:Top10bugsandtheirbugfixing译者:Fundebug为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,转载仅供学习。今天的网站几乎100%使用JavaScript。JavaScript似乎是一门非常简单的语言,其实不然。它有很多容易出错的细节,稍不注意就会导致BUG。1.对this的引用不正确在闭包或回调中,this关键字的范围很容易弄错。例如:Game.prototype.restart=function(){this.clearLocalStorage();this.timer=setTimeout(function(){this.clearBoard();//这里指的是什么?},0);};如果我们执行上面的代码,我们会看到一个错误:UncaughtTypeError:undefinedisnotafunction错误的原因是:当你调用setTimeout函数时,实际上调用的是window.setTimeout()。setTimeout传入的匿名函数是在window对象环境下,所以this指向window,但是window没有clearBoard方法。如何解决?定义一个新的变量引用指向Game对象的this,然后就可以使用了。Game.prototype.restart=function(){this.clearLocalStorage();变种自我=这个;//将this指向的对象绑定到selfthis.timer=setTimeout(function(){self.clearBoard();},0);};或者使用bind()函数:Game.prototype.restart=function(){this.clearLocalStorage();this.timer=setTimeout(this.reset.bind(this),0);//绑定到'this'};Game.prototype.reset=function(){this.clearBoard();//这里对this的引用是正确的};2.大部分编程语言都存在与块作用域相关的bug在中,每个功能块都有一个单独的新作用域,而在JavaScript中则没有。例如:for(vari=0;i<10;i++){/*...*/}console.log(i);//会输出什么?通常这种情况下调用console.log()会输出undefined或者报错。但是这里会输出10。在JavaScript中,即使for循环已经结束,变量i仍然存在并记录最后一个值。一些开发人员忘记了这一点并导致许多错误。我们可以通过使用let而不是for来消除这个问题。3.内存泄露你需要监控内存的使用情况,因为内存泄露是很难避免的。内存泄漏可能是由引用不存在的对象或循环引用引起的。如何避免:关注对象的可达性。Accessibleobjects:在现有调用栈的任何地方都可以访问的对象Globalobjects当一个对象可以通过引用访问时,它会被存储在内存中。浏览器的垃圾收集器只会回收不可访问的对象。4.混淆相等判断JavaScript会自动将布尔环境中的所有变量类型转换为布尔类型,但这可能会导致错误。示例://全部为真console.log(false=='0');console.log(null==undefined);console.log("\t\r\n"==0);console.log(''==0);//注意:下面两个也是if({})//...if([])//...{}和[]都是对象,会进行转换为真。为了防止bug,推荐使用===和!==进行比较,因为不会有隐式类型转换。5.低效的DOM操作在JavaScript中,您可以轻松地操作DOM(添加、修改和删除),但开发人员通常效率很低。这可能会导致错误,因为这些操作在计算上非常昂贵。为了解决这个问题,如果需要操作多个DOM元素,推荐使用DocumentFragment。广告:您的在线代码真的没有错误吗?欢迎免费使用Fundebug!我们可以在第一时间帮您发现bug!6.for循环中函数定义错误的例子:varelements=document.getElementsByTagName('input');varn=elements.length;//假设我们有10个元素for(vari=0;i
