繁体   English   中英

JavaScript:如何通过变量名来检查变量是否存在?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM