JavaScript:如何检查变量是否存在变量名?
我有这个问题。我有一个脚本来检查变量是否存在,因为有些脚本异步加载,比如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?
首先,你不需要那么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
}
...或者诸如此类的话。
谢谢T.J.我只改变if(index
@SODA:很好。 FWIW,如果'typeof result ==“undefined”'的赔率非常高(尽管如果你正在处理跨窗口的东西时不是100%),那么'result === undefined',你可能会丢掉第二位并保持这种检查。另外请注意,由于某种原因,我包含了'result!== null'(typeof'null'不是'“undefined”',但是如果你试图用括号解除引用'null',你会得到一个异常)。 – 2012-03-29 21:07:27
什么你要找的是:
if ('key' in object)
所以在你的榜样
if (name in window)
不适用于像twttr.widgets链接名称 – 2012-03-29 16:18:15
我一直只是使用了诸如:
if (window[name]) {
return 'it exists';
} else {
return 'nope';
}
编辑:这工作,因为如果窗口[名称]不是在那里,如果确定undefined
为假。
不,在你的情况下,如果我做var name ='FB',window.name将返回'FB',但我需要的是返回窗口['FB']或窗口.FB – 2012-03-29 16:17:01
我误解了参数。简单的修复 - 更新。 – kiswa 2012-03-29 17:11:20
要解决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();
快速的问题,就这些变量总是在脚本中存在装? – Joseph 2012-03-29 15:51:18
不能有一个名为'twttr.widgets'的变量。可以有一个名为'twttr'的变量,它可能有一个属性'widgets',但希望你可以看到它不像“这个属性是否存在”那样简单 – Gareth 2012-03-29 15:52:53
Joseph - 不,它们可能永远不存在。 Gareth - 技术上你是对的,但我想要的东西需要与物业一起工作。 – 2012-03-29 16:36:11