2010-02-10 86 views
12

之前,如果一個變量被定義或沒有我檢查,如果沒有明確的定義,我會做來定義它:「變量」用它被定義

if (typeof(aVariable) == 'undefined') { 
    var aVariable = value; 
} 

因爲變量未定義JSLint警告說,它在被定義之前使用,這正是我想要的。

我該如何克服這個問題?

我想啓用定義這些變量明確地這樣做:

<script> 
    var aVariable = value; 
</script> 
<script src="myScript.js"></script> 

所以大家誰是要包括該腳本可以自定義的一些屬性。我擔心我無法改變這種邏輯,因爲它已經以這種方式在數百個網站中使用。

向下滾動以獲取答案/解決方案,因爲我已經回答了我自己的問題堆棧溢出沒有顯示出來。一定不要錯過它們。

回答

5

我在JSLint郵件列表中找到了更多可接受的答案,對於Boldewyn,抱歉:)

解決方案1 ​​

在IE中,在腳本級別(即,每個文件或每個腳本塊),如果在解析階段(執行前)發現 「var」聲明,它將重置該變量的 值(如果它已經存在)。

所以更好的方式是簡單地做到這一點:

/*global foo: true */ 
if (typeof foo === "undefined") { 
foo = "some value"; 
} 

如果不宣佈「無功」,簡單地分配FOO,foo將自動獲得 全局範圍。

解決方案2(特殊情況)

如果明確設置變量不是零或假

var foo = foo || "some value"; 
+0

解決方案2是否存在性能損失?或有任何副作用?我想我將無法改變全球foo? – Vanuan 2012-05-15 13:48:26

+0

解決方案2似乎有一個副作用:頁面在Safari上加載後(在iOS 6.1.3上)很快崩潰,當JS文件具有行'var window = window || {};'。 Chromium(在Ubuntu 12.04上)沒有這樣的問題。奇怪。 – 2013-09-12 23:48:19

7

我認爲JSLint告訴你的是,在定義之前不應該使用變量。如果您很高興在您的情況下適用 - 您可以忽略該警告。如果你不是很確定,再想一想爲什麼這個變量還沒有定義。

例如,你真的想測試aVariable是否有值集,而不是或者沒有定義?

var aVariable = null; 

...(晚些時候)

if (aVariable == null) { 
    aVariable = value; 
} 
2

試試這個:

aVariable = null; 

aVariable = typeof(aVariable) == 'undefined' ? null : value; 
-1

這錯誤似乎當您使用駱駝外殼爲您的變量名被觸發。如果以大寫字母(變量)開始變量或將其全部設爲小寫字母(變量),則只會得到「隱含的全局」錯誤。

我不確定通過在你的變量名上強制使用套接字是什麼意思,儘管你總是需要用JSLint來處理一些鹽。你在這裏做的是完全有效的,並且是避免意外使用未定義變量的良好習慣。

+0

問題:* JSLint的警告被定義之前,它是用來*。這與駱駝案有什麼關係?它不*完全有效,因爲JSLint是正確的:在定義之前,變量*被使用。 – Boldewyn 2010-02-10 08:00:09

+1

在投票前仔細閱讀我的答案。它與OP使用的變量名稱的外殼相關:'aVariable'。在變量名稱爲'avariable','AVARIABLE'或'Avariable'中運行相同的代碼,您會注意到JSLint不再顯示錯誤。 – 2010-02-10 08:29:24

+0

那麼,您使用哪種JSLint? http://www.jslint.com/上的結果與拼寫無關,因爲它與拼寫*無關。 – Boldewyn 2010-02-10 08:45:37

4

你可以把這些變量(這是全球反正)的window明確的成員:

window.aVariable = 'default'; 

後來

if (! ('aVariable' in window)) { 
    window.aVariable = 'new value'; 
} 

如果你不想或不能改變的代碼,然後我'd建議務實的ansatz並忽略JSLint的抱怨,因爲你的代碼無論如何都會工作(也就是說,只要你不啓用ECMAScript 5的嚴格模式......)。

1

最容易聲明變量所做的任何使用它們之前:

var aVariable; 

這將類型爲「不確定」被初始化,所以不確定的測試仍然可以工作:

if (typeof aVariable == "undefined") { 
    aVariable = value; 
}