2012-03-29 173 views
4

我有這個問題。我有一個腳本來檢查變量是否存在,因爲有些腳本異步加載,比如Facebook的FB或者Twitter的twttr。JavaScript:如何檢查變量是否存在變量名?

function whenAvailable(name, callback, interval) { 
    interval || (interval = 100); // ms 
    window.setTimeout(function() { 
     if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) { 
      return callback(); 
     } else { 
      window.setTimeout(arguments.callee, interval); 
     } 
    }, interval); 
} 

貌似這個

if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) 

不起作用。 IE會拋出錯誤 eval(name) - 例如如果name ='FB',則表示它不能評估未定義的'FB'。

window.hasOwnProperty(name)如果name == 'twttr.widgets'不起作用。

是否有一個通用的和跨瀏覽器檢查VAR名稱是否存在var?

+0

快速的問題,就這些變量總是在腳本中存在裝? – Joseph 2012-03-29 15:51:18

+1

不能有一個名爲'twttr.widgets'的變量。可以有一個名爲'twttr'的變量,它可能有一個屬性'widgets',但希望你可以看到它不像「這個屬性是否存在」那樣簡單 – Gareth 2012-03-29 15:52:53

+0

Joseph - 不,它們可能永遠不存在。 Gareth - 技術上你是對的,但我想要的東西需要與物業一起工作。 – 2012-03-29 16:36:11

回答

6

首先,你不需要那麼eval(你幾乎永遠不會做),你可以索引到一個JavaScript對象使用一個字符串和括號的符號,例如:

window['FB']; 

name = 'FB'; 
foo = window[name]; 

所以要檢查:

if (typeof window[name] === "undefined") 

......除了那並不是」 t區分完全不存在或存在但具有值undefined的財產。

if (name in window) 

...但是,檢查原型,以及對象。但是,window沒問題。

window.hasOwnProperty(name)如果name == 'twttr.widgets'不起作用。

右鍵,你必須打破它:

var index = 0, 
    parts = name.split('.'), // doesn't handle [] notation 
    result; 
result = window; 
index = 0; 
try { 
    while (typeof result !== "undefined" && result !== null && index < parts.length) { 
     result = result[parts[index++]]; 
    } 
} 
catch (e) { 
} 
if (index < parts.length) { 
    // Didn't find all of it 
} 

...或者諸如此類的話。

+0

謝謝T.J.我只改變if(index 2012-03-29 16:33:47

+0

@SODA:很好。 FWIW,如果'typeof result ==「undefined」'的賠率非常高(儘管如果你正在處理跨窗口的東西時不是100%),那麼'result === undefined',你可能會丟掉第二位並保持這種檢查。另外請注意,由於某種原因,我包含了'result!== null'(typeof'null'不是'「undefined」',但是如果你試圖用括號解除引用'null',你會得到一個異常)。 – 2012-03-29 21:07:27

0

什麼你要找的是:

if ('key' in object)

所以在你的榜樣

if (name in window)

+0

不適用於像twttr.widgets鏈接名稱 – 2012-03-29 16:18:15

2

我一直只是使用了諸如:

if (window[name]) { 
    return 'it exists'; 
} else { 
    return 'nope'; 
} 

編輯:這工作,因爲如果窗口[名稱]不是在那裏,如果確定undefined爲假。

+0

不,在你的情況下,如果我做var name ='FB',window.name將返回'FB',但我需要的是返回窗口['FB']或窗口.FB – 2012-03-29 16:17:01

+0

我誤解了參數。簡單的修復 - 更新。 – kiswa 2012-03-29 17:11:20

0

要解決twttr.widgets以及twttr,是這樣的:

var parts = name.split('.') 
    , aVar = window; 

while(parts.length){ 
    aVar = aVar[ aVar.shift() ]; 
    return setTimeout(...); 
} 

// aVar will now be your resolved variable 
return callback(); 
相關問題