2014-03-27 114 views
5

如何檢查JavaScript變量是否已被實際聲明?如何檢查變量是否已被聲明,但未初始化?

這種解決方案並不在我的情況下工作:

JavaScript check if variable exists (is defined/initialized)

例子:

(function(){ 
    var abc; 
    alert(typeof abc === 'undefined') // true 
})(); 

同:

(function(){ 
    alert(typeof abc === 'undefined') // true 
})(); 

它產生在這兩種情況下true。我可以這樣做:

(function(){ 
    var abc; 

    var isDefined = false; 
    try { isDefined = abc || !abc; } 
    catch(e) {} 
    alert(isDefined); // true 
})(); 

它的工作原理,但我正在尋找更好的,這個,X瀏覽器。

EDIT:我想在一塊動態代碼經由eval運行,並檢查是否在本地或全局範圍存在一定變量來使用它。

+0

你能描述一下你的用例還是至少它們將被應用的環境,例如,是否聲明瞭函數參數或者是否有變量? –

回答

1

這個問題已被問了很多次,答案是「你不行」(除了在OP中使用try..catch之外)。

您可以檢查使用hasOwnProperty一個對象的屬性,但是這兩個要求,你可以訪問你要測試的對象。變量屬於執行上下文的變量對象(ES 3)或environment record(ES 5),並且它們不可訪問,因此您無法檢查其屬性。

的特殊情況是全局對象,因爲全局變量(即全球環境記錄的屬性)是由全局對象的屬性,所以你可以這樣做:

var global = this; 
var foo; 

// Declared but not initialised 
foo in global // true 
global.hasOwnProperty('foo'); // true 

// Not declared or initialised 
bar in global // error 
global.hasOwnProperty('bar'); // true 

然而,hasOwnProperty不支持全局對象對IE <版本9.

+0

爲什麼「你不能」?我實際上發佈了一個代碼,可以*做到這一點。 – avo

+1

這就是爲什麼我回答「我正在尋找更好的這個」部分。使用try..catch不被認爲是一個好主意,更好地理解你爲什麼要這樣做。通常你可以使用對象的屬性而不是變量。 – RobG

1

您可以檢測使用"use strict"此類似這樣的方法:

"use strict"; 
try { 
    myVar = 7; 
    console.log("myVar is "+myVar); 
} catch(e) { 
    console.log("error"); 
} 

運行該腳本,它將打印「錯誤」。然後註釋掉「嚴格使用」並重新運行;它會打印出「myVar是7」。

+0

這取決於'「使用腳本」'仍然使用'try/catch'。我的問題中的最後一個代碼段沒有嚴格模式。有沒有'try/catch'這樣做的方法? – avo

+1

這不是一個好主意,因爲它爲變量分配一個值來測試它。也許最好嘗試讀取數值,例如'var a = myVar'。它在嚴格模式下「工作」,因爲它不允許隱式創建全局變量。 – RobG

+0

@RobG你錯過了這一點。如果您以* any *的方式使用myVar,將會拋出錯誤。你可以用if(myVar == 0)替換myVar = 7,如果myVar沒有被聲明的話,代碼會拋出一個錯誤。 –

相關問題