2012-05-10 146 views
3

我使用下面的命名空間模式「之前它被定義爲使用的功能」的JSLint:命名空間格局導致錯誤

var MyNamespace = new function() { 
    var foo = function() { 
     bar(); 
    }; 
    var bar = function() { 
     alert("bar"); 
    }; 
    this.init = function() { 
     foo(); 
    }; 
}; 

$(document).ready(function() { 
    MyNamespace.init(); 
}); 

的JSLint抱怨它的定義之前bar使用。但foo不會被調用,直到bar已被聲明爲止。該代碼適用於我嘗試過的所有瀏覽器:http://jsfiddle.net/jDKvz/

該模式爲每How do I declare a namespace in JavaScript?,第二個答案。

我是否需要在此修復某些內容,還是應該忽略JSLint?

+0

大概假如你顛倒了這兩個函數的順序,JSLint會很高興,但是你是否「需要」這樣做是主觀的。我不同意JSLint的一切,但在這種情況下,我可能只是改變代碼來讓它閉嘴。 – nnnnnn

+0

@nnnnnn我的真實項目要複雜得多,可能包含相互調用的函數。 – Flash

+0

在這種情況下,我很樂意在這一點上忽略JSLint。儘管我可能會嘗試使用'function foo()...'語法而不是'var foo = function()...'來查看它是否有任何區別,因爲它很煩人必須記住哪些lint警告/錯誤必須其實關心... – nnnnnn

回答

1

我懷疑這是因爲吊裝,變量和函數聲明高掛到由解釋頂部,很可能這是它是如何看待它:

var MyNamespace = new function() { 
    var foo; 
    var bar; 

    foo = function() { 
     bar(); 
    }; 

    bar = function() { 
     alert("bar"); 
    }; 

    this.init = function() { 
     foo(); 
    }; 
}; 

現在內bar()尚未解析,它只是一個變量bar不是在該點被調用的函數。儘管如此,如果你的代碼工作正常,你可以使用它,關於strict mode也是有幫助的。

0

編輯:想到JS關閉了值,而不是變量。

JSLint正在抱怨,因爲它沒有看到變量提升正在進行。只需定義其他函數在使用它們的函數之前使用的函數。它有助於使您的代碼更具可讀性,並關閉JSLint。

例如:

var MyNamespace = new function() { 
    var bar = function() { 
     alert("bar"); 
    }; 

    var foo = function() { 
     bar(); 
    }; 

    this.init = function() { 
     foo(); 
    }; 
}; 
+0

我的代碼也有效,請參閱有問題的小提琴。 – Flash

+0

「關閉規則」?再想一想。 _「在未定義的值上關閉......」_ - 關閉_variables_關閉,而不是_values_。問題中顯示的代碼將工作,因爲'bar'由調用'foo()'的時間定義。反轉這些函數應該關閉JSLint,但原來的方式並沒有錯。 – nnnnnn

+0

好的,改變了關於可讀性的答案,而不是關於錯誤的關閉內容。我不會告訴某人使用函數聲明。 – Havvy

0

bar函數式,而不是一個函數聲明,這意味着它的安排,它只會工作。您可以使用函數聲明,jslint不會再抱怨。

function bar() { 
    ... 
} 

此外,new Function是不必要的,function就足夠了。

編輯:

好像在這種情況下,以擺脫new使用自動調用功能(function(){}())或對象文本{}

+0

這裏'new' *是必要 – KooiInc

+0

爲什麼,目的是什麼? – elclanrs

+1

它將以下函數作爲構造函數調用。 – Havvy