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

mvb*_*fst 5 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);
}
Run Code Online (Sandbox Code Playgroud)

看起来像这样

if ((window.hasOwnProperty && window.hasOwnProperty(name)) || window[name] || !!eval(name)) 
Run Code Online (Sandbox Code Playgroud)

不起作用.IE为eval(名称)抛出错误 - 例如,如果name ='FB',它表示它不能评估未定义的'FB'.

window.hasOwnProperty(name)如果不起作用name == 'twttr.widgets'.

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

T.J*_*der 7

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

window['FB'];
Run Code Online (Sandbox Code Playgroud)

要么

name = 'FB';
foo = window[name];
Run Code Online (Sandbox Code Playgroud)

所以要检查:

if (typeof window[name] === "undefined")
Run Code Online (Sandbox Code Playgroud)

...除了不区分根本不存在的属性,或者存在但具有该值的属性undefined.

要么

if (name in window)
Run Code Online (Sandbox Code Playgroud)

...但是检查原型和对象.不过,这很好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
}
Run Code Online (Sandbox Code Playgroud)

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