[英]JavaScript: How to check if variable exists by variable name?
我有这个问题。 我有一个脚本,检查变量是否存在,因为一些脚本异步加载,如FB for Facebook或twttr for Twitter。
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 ='FB',它表示它不能评估未定义的'FB'。
如果name == 'twttr.widgets'
window.hasOwnProperty(name)
不起作用。
是否存在通过var名称存在var的通用和跨浏览器检查?
首先,你不需要那个eval
(你几乎从不这样做),你可以使用字符串和括号表示法索引到JavaScript对象,例如:
window['FB'];
要么
name = 'FB';
foo = window[name];
所以要检查:
if (typeof window[name] === "undefined")
...除了不区分根本不存在的属性,或者存在但undefined
值的属性。
要么
if (name in window)
...但是检查原型和对象。 不过,这对window
来说很好。
如果
name == 'twttr.widgets'
window.hasOwnProperty(name)
不起作用。
对,你必须分手:
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
}
......或者那种效果。
我一直只是用过这样的东西:
if (window[name]) {
return 'it exists';
} else {
return 'nope';
}
编辑:这是有效的,因为如果窗口[名称]不存在,if确定undefined
为false。
你在寻找的是:
if ('key' in object)
所以在你的例子中
if (name in window)
要解决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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.