2012-03-28 90 views
0

我有一個使用全局變量像許多JS方法:如何有效地檢查是否變量已宣佈

function DoSomething() { 
    var val=$('#'+clientId).val(); 
    . 
    . 
    . 
} 

DoSomething的使用的clientId變數。問題在於clientId並不總是被聲明的,因此我得到了未聲明的變量的異常。
我有很多這樣的地方,並添加if (typeof clientId == "undefined")檢查無處不在是很多工作和代碼重複(重複檢查)。有我可以解決它嗎?例如,如果變量未被聲明,則使用返回null的方法? (在這種情況下,我可以控制返回值,例如在未定義的情況下)

+1

您可以創建這樣的方法,實現'如果( typeof variable ==='undefined')'。在我看來這是一個很好的解決方案。 – iMoses 2012-03-28 14:56:17

回答

0

只是一個想法:所有變量都是名稱空間的屬性,直到全局名稱空間(在瀏覽器中,即window)。未分配的房產評估爲undefined。所以如果你想知道是否分配了一個變量,你可以使用if (property in namespace)。如果它涉及瀏覽器中的全局變量:if (clientId in window)。現在你可以做出一個功能:

function exists(label, namespace){ 
    namespace = namespace || window; 
    return namespace[label] || false; 
} 
// possible usage 
function DoSomething() { 
var val=$('#'+(exists('clientId')||0)).val(); 
// ... 
} 
0

全局變量是邪惡的,如果可能的話,要避免。

在你給的例子,這將是更好的申報客戶端ID作爲一個參數,像這樣:

function DoSomething(clientId) { 
    var val=$('#' + clientId).val(); 
    . 
    . 
    . 
} 

這樣,你不會受到全局變量問題,有沒有副作用效果(由其他方法引起的價值變化)擔心。

祝你好運!

+0

我喜歡那些只是伸出援手來幫助別人的人,然後砰的一聲。你可以在沒有惡意評論的情況下添加鏈接,這樣會更好。我不是鸚鵡,順便說一句,我有29年的編程經驗,並且知道繩索,謝謝。祝你今天愉快。 – 2012-03-28 19:04:45

1

在我看來,如果您的代碼路徑試圖在定義之前使用全局變量,那麼您的代碼就會被破壞。要麼你需要給它一個默認值,你需要重新排序代碼的加載或執行,或者當你的環境沒有被初始化時,你需要阻止代碼運行。

它可以初始化變量當且僅當它尚未定義是這樣的:

var clientId = clientId || "foo"; 

你可以把這個在使用它的任何模塊的頂部。這會初始化它,只要它沒有被初始化就可以。

你也可以建立你自己,你會改用直接訪問這樣的變量的訪問功能:

// put this somewhere early in the JS loading process 
function getClientId() { 
    if (typeof window.clientId !== "undefined") { 
     return(window.clientId); 
    } else { 
     return("foo"); // whatever default value you want to return here 
    } 
} 

// use it like this: 
function DoSomething() { 
    var val=$('#'+getClientId()).val(); 
    . 
    . 
    . 
} 

或者,你可以做一個全球性的功能,將測試:

function isClientId() { 
    return(typeof window.clientId !== "undefined"); 
} 


// use it like this: 
function DoSomething() { 
    if (isClientId()) { 
     var val=$('#'+clientId).val(); 
     . 
     . 
     . 
    } 
} 
+0

var clientId = clientId ||中的問題「富」;當clientId被定義時,它變成了未定義的。 – Naor 2012-04-01 10:22:37

+0

@Naor - 那是不正確的。 'var clientId = clientId || 「foo」;'不能使'clientId'未定義。只有當'clientId'是一個像undefined','null','0','false'這樣的falsey值時,它纔會將'foo''分配給clientId。它不會也不能使它成爲'undefined' 。如果您看到了這一點,那麼您的代碼中還有其他事情需要您向我們展示。 – jfriend00 2012-04-01 10:32:29

+0

Here:http://jsfiddle.net/eVxmX/ – Naor 2012-04-01 11:16:32

0

嘗試:

var isExists =clientId || false; 

,但要小心

if ClientId==0它會告訴你假。

0

我用:

if (typeof (foo) != 'undefined') 
    alert ('foo is defined'); 
+0

我認爲這是最簡單的方法來做到這一點......但我同意beardtwizzle。我經常使用「相同類型」相同的「===」,如:if(foo === true)或if(foo ==='text') – Redtopia 2012-03-28 14:58:32

0

如果變量本身聲明(而不是僅僅有一個未定義的值),那麼你可以簡單地使用(clientId || 'default value')。這要求你在全球範圍內有var clientId;或類似的東西(這是不好的做法,BTW)。

如果您沒有保證clientId已被聲明在某處,那麼使用上述構造仍然會拋出未定義的變量錯誤。在這種情況下,你可以使用這個:(typeof clientId == 'undefined' ? 'default value' : clientId)

0

雖然我喜歡答案,我去簡單的方法...只是聲明var clientId;在你的腳本之上。如果你不把它傳遞那麼任何值:

var clientId; 
if(!clientId){ 
    //will reach here cause declared but with no value 
} 

var clientId; 
clientId = 132; 
if(!clientId){ 

}else{ 
     //will reach here cause it has a value 
} 

所以

function DoSomething() { 
     if(clientId){ 

會工作