2010-03-05 81 views
10

我有一個漫長的JavaScript文件,通過JSLint除「定義之前使用」錯誤。爭奪JS之前「定義之前使用」和鈦開發者

我用正常的函數聲明,如...

function whatever() {do something;} 

,而不是...

var whatever = function(){do something;}; 

Steve Harrison's reply到一個較早的職位一致...

假設你用函數關鍵字聲明瞭所有的 函數,I 認爲它成爲編程風格 的問題。就個人而言,我傾向於以 似乎合乎邏輯的方式構造我的功能,並使代碼儘可能可讀爲 。例如,像你這樣的 ,我會在 的頂部放置一個初始化函數,因爲它是所有從 開始的地方。

...我喜歡以對我有意義的順序來看功能。該腳本在測試過的幾個瀏覽器(例如,FireFox,Safari,Mobile Safari,Fennec,IE,Chrome,Midori等)中完美運行。

問題出在這裏:我想使用Titanium構建的iPhone應用程序內部的腳本,但其編譯器停止並顯示「used before defined」錯誤。

我該如何解決這個問題?

這可能是一個愚蠢的問題,但也...如果函數需要以特定的順序調用,如何解決被調用函數的問題需要回調到最初調用它的函數?例如...

function buildMenu(){ 
    Display a list of five menu items, each of which calls a function to build the associated screen. 
} 

function screen1() { 
    Display the screen associated with menu item #1. 
} 

如果函數需要以聲明,function screen1需要先function buildMenu。但是,如果在某些情況下screen1不能被創建並因此想重新顯示菜單(即,調用技術上尚未聲明的函數)呢?

哦,是的...還有一個問題:是否有網站或程序自動重新排序的功能,而不是要求程序員做手動?

回答

8

不,EM的答案不是正確的解決方案。嘗試運行這個JavaScript:

(function() { 
    foo(); // right 

    var foo = function() { 
    console.log("wrong"); 
    }; 

    foo(); // wrong 

    function foo() { 
    console.log("right"); 
    } 

    foo(); // wrong 
}()); 

這是因爲解釋器將首先讀取函數聲明,創建名foo作爲打印「右」的功能,然後讀取var聲明,發現已經是一個有名稱foo,因此它會跳過創建值爲undefined的新變量,正常情況下會發生。然後它逐行處理代碼,其中包括foo的分配。函數聲明不會被重新處理。也許這在Titanium中表現會有所不同,但在Firebug中試試這個,你會得到我所得到的。

更好的解決方案是:

var screen1, buildMenu; 

screen1 = function() { buildMenu(); }; 
buildMenu = function() { screen1(); }; 

這也將通過JSLint的,併產生正確的行爲。

+0

謝謝。我沒有時間檢查以前的解決方案,所以我會給這個鏡頭。再次感謝。 – 2010-03-05 21:21:53

+0

好點。我沒有真正測試我的解決方案。我只是通過jslint運行它。 – EndangeredMassa 2010-03-06 00:54:04

+0

在JSLint和Titanium中完美工作。再次感謝。 B. 順便說一句:對於任何需要對現有腳本進行此更改的人(和我一樣),創建全局變量函數列表的簡單快捷方式是通過JSLint運行腳本並從底部複製全局列表結果。這不是100%準確,但在我的情況下,有大約100個功能,我只需要進行6次調整。 – 2010-03-06 04:24:17