2011-10-10 72 views
7

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的,並且剛剛花了我幾個小時的調試(真正的代碼是當然的幅度更復雜的幾個數量級),我不知道還有什麼我可以做減少浪費時間在這種毫無根據的寬大。這不是一個孤立的例子;它似乎一遍又一遍地發生。有什麼建議麼?

+0

根據你的論點是沒有意義的。據引擎,我相信他們這樣做。你會從你的「bug」中期望哪些錯誤?像「無效論證」? – bzlm

+0

@bzlm我很想討論這個問題,但是我擔心這會使問題偏離正軌。我無法更改JavaScript,並且我無法更改jQuery(很多),所以我想知道如何避免這種情況。 –

+1

我感到你的痛苦。令人難以置信的是這種容易出錯的編程風格是多麼受歡迎。幾乎沒有一天,沒有我必須瀏覽我自己的JS代碼,並盯着最細微的語法的每個細節,找到一個合適的編譯器可以找到並在一秒鐘內標記的錯誤。我不知道其他人如何享受這種令人沮喪的經歷,但是他們這樣做,他們不可能以這種方式提高生產力。 – Timwi

回答

0

看起來你誤以爲

$.when([x,y]) 

$.when(x,y) 

我不認爲這是一個分析工具,在那裏,這將有助於趕上這樣的錯誤,因爲它是完全可以接受的通一個列表到什麼時候。如果你想有一個更嚴格的功能,你可以自己做一個:

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

它實際上是可能的check types在運行時在Javascript中,它只是嚴格要求是不是在JavaScript中的首選樣式。 JS黑客喜歡把它掛起來。

其他黑客應付這個,雖然,對不對?所以,我不建議您花費很長時間將語言或jQuery歸咎於調試此問題,而是建議您調查其他方法來減少調試工作。

這裏有一對夫婦的建議,我能想到的:先在你的.js文件粘貼之前

  1. 測試出小塊的互動JS控制檯代碼:這個
    • 讓你快速迭代,直到你得到它的權利(你如何使用$。當()?)
    • 確保當你得到它的權利,你瞭解如何使用API​​
  2. 保持螺柱英JS,並繼續寫更多。第二個錯誤是:在函數中沒有包裝console.log(「全部完成」),這表明關於JS的基本概念還沒有完全鎖定到位 - 一個經驗豐富的JS黑客決不會犯這個錯誤。
+0

'「經驗豐富的JS黑客永遠不會犯這個錯誤」 - 你對此有多確定?你只能這樣說,因爲我們無法一直看你的屏幕。如果有人看到你在JS中犯了類似的錯誤,即使有一次,你也會看起來像一個大僞君子。 – Timwi

+1

類型檢查只能防止類型錯誤。 OP的錯誤實際上並不是一個類型錯誤(並且更多的問題是當有一個混亂的API時)$ – hugomg

+2

OP的錯誤*是*實際上是一個類型錯誤(至少,不包裝'console.log'的錯誤會被類型檢查)。我是一個經驗豐富的JS黑客,我每兩週就犯一次這個錯誤。 – Malvolio

1

在你更突出的錯誤的情況下,答案可以用兩個字來表示:static typing。靜態打字並不能解決所有問題,但是它會耗費大量的時間來追蹤這些微妙的失敗。

靜態類型的缺點是而不是,因爲缺少索賠,與編程更困難或功能更弱或類似的東西有關。最大的問題是,語言的打字系統的強度似乎與語言的流行程度相反。像Scala和Haskell這樣的非常好類型的語言仍然處於精品級的接受程度。 Java更受歡迎,但它的類型系統很難使用並且出現了很多漏洞;類似的可以說是C#。非常流行的PHP的類型系統將會成爲一箇中立的觀察者,作爲故意的破壞行爲。像FORTAN和C這樣的老式語言甚至都沒有嘗試過。

我不知道這是爲什麼,但我確信明顯的解釋 - 人們不喜歡強打字 - 是不正確的。

一個相關的問題是,你還不能編譯任何強類型語言到JavaScript。最接近的方法可能是GWT

+0

暫停問題的不可判定性保證有非常好的非類型化程序不能被編譯器靜態檢查,所以它在技術上是靜態類型是一個限制:P但是,我認爲在識別Haskell使我也是正確的對於類型系統來說是挑剔的。 – hugomg

+0

@missingno:這與暫停問題無關。您不需要圖靈完整類型系統來表示任何程序。如果你需要輕鬆的類型檢查,你總是可以使用超級類型的「對象」。最重要的是,C#甚至具有「動態」類型,這很像你想要的。有了這個,靜態類型是一種非類型語言可以提供的額外功能,並且不會帶走任何東西。 (實際上,我發現「動態」類型很少有用。) – Timwi

+0

@Timwi:我曾希望這張愚蠢的笑臉能夠清楚地表明這是一個明顯的過度評論。 – hugomg