2009-05-01 19 views
63

的JSLint(與onevar標誌開啓)「太多的VAR聲明」的原因是萎靡不振,我有以下一些JavaScript代碼:什麼是落後的JSLint說有

Problem at line 5 character 15: Too many var statements.

我很高興修復這些錯誤,但我想知道,我是因爲性能還是因爲這只是一個糟糕的做法,並且更有可能在我的JavaScript代碼中引入錯誤。 onevar旗幟背後的原因是什麼?

我沒有看看var keyword的JSLint文檔,但它沒有具體談論爲什麼同一函數中的多個var語句不好。

這是一個例子的嘗試。解釋如何代碼將僅具有1個var語句中受益:

function Test(arg) { 
    var x = arg + 1, 
     y = cache.GetItem('xyz'); 
    if (y !== null) { 
     // This is what would cause the warning in JSLint 
     var request = ajaxPost(/* Parameters here */); 

    } 
} 
+0

向我們展示你的腳本! – alex 2009-05-01 05:56:49

回答

99

Javascript沒有塊範圍。在其他語言(如c)中,如果你在if語句中聲明一個變量,你不能在它之外訪問它,但在JavaScript中你可以。 JSLint的作者認爲這是一種不好的做法,因爲你(或其他讀者)可能會感到困惑,並認爲你不能再訪問變量,但實際上可以。因此,您應該在函數的頂部聲明所有變量。

+0

比我更好的回答,改裝。 – tpdi 2009-05-01 06:14:13

1

只是猜測這裏,但它可能是時間functional decomposition。功能應該做一個事情做得很好。

太多的變量提示函數試圖做得太多。或者你應該使用數組的情況。

+0

不確定我同意這一點。在這種情況下,「太多」不止一個變種。爲了解決這個問題,你可以使用逗號(`var x,y;`),但很難閱讀。在我看來,這很荒謬,而且很難讀取代碼。我目前正在處理一個有很多這樣的項目,很難看到變量被聲明在哪裏。 – 2016-01-07 16:19:51

3

如果「onevar」選項設置爲true(如果每個函數只允許一個var語句)。

if (funct['(onevar)'] && option.onevar) { 
    warning("Too many var statements."); 
} 
+0

好的,我在問題中澄清說明我特意將其轉換。所以我知道它爲什麼會警告我,但是修復這些警告對我的代碼會起什麼作用? – slolife 2009-05-01 06:01:05

-6

這個想法是,你應該使用一個對象,而不是個別的變量。那麼,你有:

var x = arg + 1, 
    y = cache.GetItem('xyz'); 

將其更改爲:

var dimensions = {}; 
dimensions.x = arg + 1; 
dimensons.y = cache.GetItem('xyz'); 
dimensions.request = ... 

然後,您可以通過對象訪問這些變量,其整齊讓每個功能一個對象包含函數的變量。那麼你不會得到警告。

6

這樣就宣告你的增值經銷商在同一個地方:

var request,x,y; 
29

官方的理由is here,由Douglas Crockford的。

報價:

在許多語言中,一個塊引入了一個範圍。塊中引入的變量 在塊外部不可見。

在JavaScript中,塊不引入作用域。只有 函數範圍。函數中隨處可見的變量是 。 JavaScript的方塊混淆了 有經驗的程序員,並導致錯誤,因爲熟悉的語法 做出了錯誤的承諾。

JSLint期望帶有函數的塊if,switch,while,for,do和 嘗試語句和其他地方。

在具有塊範圍的語言中,通常建議在首次使用的站點聲明 變量。但是因爲JavaScript 沒有塊範圍,所以在函數頂部聲明一個函數的所有變量 是明智的。建議每個函數使用一個單獨的 var語句。這可以通過增值選項 來降低。

2

推理已經描述。

的建議是使用這種形式:

var myVar1 = document.getElementById("myDiv1"), 
    myVar2 = document.getElementById("myDiv2"); 

或本:

var myVar1, myVar2; 
myVar1 = document.getElementById("myDiv1"); 
myVar2 = document.getElementById("myDiv2"); 

但這並不看起來非常漂亮,特別是如果你想要記錄瓦爾。

所以你可以即暫時禁用此警告:

/*jslint vars: true*/ 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar1 = document.getElementById("myDiv1"); 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar2 = document.getElementById("myDiv2"); 
    /*jslint vars: false*/ 

警告:確保這是在功能上完成的。

我認爲這樣做是因爲jslint無法可靠地確定是否在函數頂部聲明瞭變量。

相關問題