如何在我的代码中减少这种错误的频率

How to reduce the frequency of such errors in my code?

本文关键字:错误 频率 我的 代码      更新时间:2023-09-26

看看这个JsFiddle:

var requests = [
  $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' })
    .done(function() {console.log("request");}),
  $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' })
    .done(function() {console.log("request");})
];
$.when(requests).done(console.log("alldone"));

预期输出是:request request alldone,但实际上打印的是alldone request request

这段代码中实际上有两个bug(如果你喜欢这种东西,可以留作练习),但最终我认为这是因为JavaScript和jQuery在给出毫无意义的参数时都非常宽松。在这种环境中,"正确"的事情似乎是"做点什么或者什么都不做,只是不要抛出错误!"。

看到这段代码通过了JsLint,并且刚刚花费了我几个小时来调试(实际代码当然要复杂几个数量级),我想知道我还能做些什么来减少在这种毫无根据的宽大处理上浪费时间。这不是一个孤立的例子;这种事似乎一次又一次地发生。有什么建议吗?

实际上可以在Javascript运行时检查类型,只是严格不是Javascript的首选样式。JS黑客喜欢把它放轻松。

其他黑客对付这个,对吗?因此,与其将长时间调试这个问题归咎于语言或jQuery,不如研究其他方法来减少调试工作。

以下是我能想到的几个建议:

  1. 在将代码粘贴到.js文件之前,先在交互式JS控制台测试一小段代码
    • 允许你快速迭代,直到你得到正确的(你如何使用$.when() ?)
    • 确保当你做正确的,你知道如何使用API
  2. 继续学习JS,继续写更多的JS。你犯的第二个错误是:没有在函数中包装console.log("all done"),这表明JS的基本概念还没有完全锁定到位——一个经验丰富的JS黑客永远不会犯这样的错误。

对于更突出的错误,答案可以用两个字来表示:静态类型。静态类型并不能解决所有问题,但是它从跟踪这些细微故障的工作中省去了一大块。

静态类型的缺点是不是,就像missingno声称的那样,它会使编程变得更困难或更不强大或诸如此类。最大的问题是,一种语言的类型系统的强度似乎与该语言的流行程度成反比。非常好的类型化语言,如Scala和Haskell,仍然处于被接受的精品水平。Java更受欢迎,但它的类型系统很难使用,而且漏洞百出;c#也有类似的情况。非常流行的PHP的类型系统会把中立的观察者视为蓄意破坏。像FORTAN和C这样的老语言甚至都不会尝试。

我不知道为什么会这样,但我确信显而易见的解释——人们不喜欢强类型——是不正确的。

一个相关的问题是,你还不能将任何强类型语言编译成JavaScript。最接近的方法可能是GWT。

看来你搞错了

$.when([x,y])

$.when(x,y)

我不认为有一种分析工具可以帮助捕获这种错误,因为将列表传递给when是完全可以接受的。如果你想要一个更严格的函数,你可以自己创建一个:

function whenForMoreThanOne(list_of_deferreds){
    return $.when.apply($, list_of_deferreds);
}