1

有没有办法在不使用的情况下执行以下操作eval()

以下函数接受一个字符串数组,其中字符串是对象名称。我遍历它们以确保它们都不是未定义的。我希望能够在不使用的情况下做到这一点eval()

function hasMissingDependencies(dependencies) {
    var missingDependencies = [];

    for (var i = 0; i < dependencies.length; i++) {
        if (eval('typeof ' + dependencies[i]) === 'undefined') {
            missingDependencies.push(dependencies[i]);
        }
    }

    if (missingDependencies.length > 0) {
        return true;
    }

    return false;
}

有了这个,我可以通过以下内容并得到我想要的东西:

alert(hasMissingDependencies(['App.FooObject', 'App.BarObject']));

当对象名称作为字符串传递时,我宁愿不使用eval()但还没有找到另一种方法来检查对象是否未定义。

4

2 回答 2

5

假设这些是全局变量(IE 未在内部函数范围内定义),您可以拆分句点并使用括号表示法。

就像是

function isDefined(name, obj){
   if(!obj){
      obj = window;
   }
   var pathArr = name.split(".");
   obj = obj[pathArr.splice(0,1)];
   if(typeof obj !== undefined){

     return pathArr.length ? isDefined(pathArr.join("."),obj): true;
   }

   return false;


}

请注意,除非您尝试编写 requireJS 替换,否则这几乎总是一个坏主意。检查值是否存在于您调用函数的上下文中,然后传入值(如果存在)或 null/undefined/某个默认值。如果您不控制传递的上下文,请询问对象,然后检查它们是否已定义。

于 2013-04-09T19:11:06.190 回答
2

您似乎想检查名称在您的数组中的全局变量是否已定义。

您可以构建一个简单的函数来获取这些变量:

function getVar(name) {
   var v = window, path=name.split('.');
   while (path.length>0 && v) v = v[path.shift()];
   return v;
}

这将允许您测试

if (typeof getVar(dependencies[i]) === 'undefined')
于 2013-04-09T19:03:42.510 回答