2012-03-29 323 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(); 
相关问题