有没有办法在不使用的情况下执行以下操作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;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我就可以传递类似下面的内容并得到我想要的东西:
alert(hasMissingDependencies(['App.FooObject', 'App.BarObject']));
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用eval()但是没有找到另一种方法来检查对象名称作为字符串传递时是否未定义对象.
假设这些是全局变量(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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,除非您尝试编写requireJS替换,否则这几乎总是一个坏主意.检查值是否存在于您调用函数的上下文中,然后传入值(如果存在)或null/undefined /否则为某个默认值.如果您不控制传递上下文,请询问对象,然后检查它们是否已定义.