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

时间:2012-03-29 15:49:21

标签: javascript

我遇到了这个问题。我有一个脚本来检查变量是否存在,因为有些脚本是异步加载的,比如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'。

如果window.hasOwnProperty(name)

name == 'twttr.widgets'无效。

是否存在通过var名称存在var的通用和跨浏览器检查?

4 个答案:

答案 0 :(得分:6)

首先,您不需要eval(您几乎从不这样做),您可以使用字符串和括号表示法索引JavaScript对象,例如:

window['FB'];

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

所以检查:

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

...除了不区分根本不存在的属性,或者存在但具有值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
}

......或者那种效果。

答案 1 :(得分:2)

我一直只是用过:

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

编辑:这是有效的,因为如果窗口[名称]不存在,则if确定undefined为假。

答案 2 :(得分:0)

您正在寻找的是:

if ('key' in object)

所以在你的例子中

if (name in window)

答案 3 :(得分: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();