如何减少代码中此类错误的频率?

时间:2011-10-10 18:38:20

标签: javascript jquery

看看this 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

这段代码中实际上有两个错误(如果你喜欢那种东西,那么它就是一个练习),但最终我认为这是因为当给出的参数毫无意义时,JavaScript和jQuery都非常宽松。在这种环境中,“正确”的东西似乎是“做某事或什么也不做,只是不要抛出错误!”。

看到这段代码传递了JsLint ,并且花了我几个小时来调试(真正的代码当然要复杂几个数量级),我想知道还有什么我可以做到减少浪费时间这种毫无根据的宽大处理。这不是一个孤立的例子;它似乎一遍又一遍地发生。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

在Javascript中,它在运行时实际上可以check types,它只是严格不是Javascript中的首选样式。 JS黑客喜欢把它挂掉。

其他黑客虽然应对这种情况,对吧?因此,我建议您调查其他方法来减少调试工作,而不是长时间责备语言或jQuery来调试此问题。

以下是我能想到的一些建议:

  1. 首先在交互式JS控制台中测试一小段代码,然后再粘贴到.js文件中:这个
    • 允许你快速迭代,直到你做对了(你如何使用$ .when()?)
    • 确保当您确实正确使用时,了解如何使用API​​
  2. 继续学习JS,并继续写更多内容。你做的第二个错误:没有在一个函数中包装console.log("所有完成")表明关于JS的基本概念还没有完全锁定到位 - 一个经验丰富的JS黑客永远不会犯这个错误。

答案 1 :(得分:1)

如果您出现更突出的错误,答案可以用两个词来表达:static typing。静态打字并不能解决所有问题,但它会在追踪这些微妙失败所涉及的工作中掏出很大一部分。

静态类型的缺点是,因为missno声称,与编程更难或更强大或类似的任何事情有关。最大的问题是语言打字系统的强度似乎与语言的流行程度成反比。像Scala和Haskell这样的类型很好的类型语言仍处于接受的精品级别。 Java更受欢迎,但它的类型系统难以使用并且充满漏洞;类似的东西可以说是C#。非常受欢迎的PHP的类型系统会将中立的观察者视为故意的破坏行为。像FORTAN和C这样的老语言甚至都没有尝试过。

我不知道为什么会这样,但我确信明显的解释 - 人们不喜欢强打字 - 是不正确的。

相关问题是您无法将任何强类型语言编译为JavaScript。最接近的方法可能是GWT

答案 2 :(得分:0)

看起来你错了

$.when([x,y])

$.when(x,y)

我不认为有一个分析工具可以帮助捕获这种错误,因为将列表传递到何时是完全可以接受的。如果你想要一个更具限制性的功能,你可以自己制作一个:

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