2011-09-15 69 views
22

爲什麼JSLint會在使用尚未定義的函數時抱怨?關鍵是函數是被定義的 - 如果那個函數調用了那個函數,那個函數就存在了,事情就會起作用。jsLint錯誤:「在定義之前使用了somefunction()」

看看下面的代碼:

function foo() 
{ 
    // calls bar() 
}; 

function bar() 
{ 
    // calls foo() 
}; 

有沒有辦法來組織這樣一種方式,它將使JSLint的快樂2種方法。我該如何處理這個問題?

回答

13

看到這個答案:

Contending with JS "used before defined" and Titanium Developer

基本上,如果你使用foo = function() { ... }形式,你可以在上面聲明var foo, bar;避免JSLint的錯誤。

+5

但是這與函數foo()有點不同,是函數表達式和全部。另外,由於提升,在頂部聲明'var foo,bar'是多餘的。所以,簡而言之,'var foo = function()...,var bar = function()...'在技術上會做得很好。此外,我認爲,考慮到函數聲明是在其他任何東西之前加載的--JSLint應該已經修復了它們的東西。 – ZenMaster

+8

@ ZenMaster:一個'jslint',['jsHint'](http://www.jshint.com/docs/)的分支,解決了這個問題,讓你在選項中設置''latedef':false''。 (它不影響變量名稱,只是函數名稱。) –

+1

這個答案將打破依賴函數定義提升的代碼〜 –

15

就我所知,JSLint無法處理這個問題,但基於JSLint的JSHint以正確的方式解決了這個問題。

只需使用「latedef」屬性並將其設置爲「false」即可。如果你想檢測這些有問題的變量定義,但想使用函數表達式並允許這些函數提升,可以設置「latedef」:「nofunc」。

看看吧here

+0

一個註釋 - 「latedef」選項的「nofunc」值有助於避免檢查函數聲明(不是表達式)。 – Alexei

相關問題