检查对象名称为string的地方是否定义了object

Check if object is defined where object name is string

本文关键字:是否 定义 object 方是否 对象 string 检查      更新时间:2023-09-26

有没有办法在不使用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(),但还没有找到另一种方法来检查当对象名称作为字符串传递时对象是否未定义

假设这些都是全局变量(即不在内部函数作用域内定义),您可以按句号分隔并使用括号标记。

比如

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/一些默认值,则传递这些值。如果你不控制传递的上下文,请求对象,然后检查它们是否被定义。

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

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

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')