Как написать этот код JavaScript без eval?Как написать этот код JavaScript без eval?
var typeOfString = eval("typeof " + that.modules[modName].varName);
if (typeOfString !== "undefined") {
doSomething();
}
Дело в том, что имя переменной var, которую я хочу проверить, находится в строке.
Возможно, это просто, но я не знаю как.
Редактировать: Спасибо за очень интересные ответы. Я буду следовать вашим предложениям и интегрировать их в свой код, а также провести некоторое тестирование и отчет. Может потребоваться некоторое время.
Редактировать 2: У меня был другой взгляд на майку и, возможно, лучше, я показываю вам большую картину. Я благодарен для специалистов, чтобы объяснить так красиво, лучше с большим кодом:
MYNAMESPACE.Loader = (function() {
function C() {
this.modules = {};
this.required = {};
this.waitCount = 0;
this.appendUrl = '';
this.docHead = document.getElementsByTagName('head')[0];
}
function insert() {
var that = this;
//insert all script tags to the head now!
//loop over all modules:
for (var modName in this.required) {
if(this.required.hasOwnProperty(modName)){
if (this.required[modName] === 'required') {
this.required[modName] = 'loading';
this.waitCount = this.waitCount + 1;
this.insertModule(modName);
}
}
}
//now poll until everything is loaded or
//until timout
this.intervalId = 0;
var checkFunction = function() {
if (that.waitCount === 0) {
clearInterval(that.intervalId);
that.onSuccess();
return;
}
for (var modName in that.required) {
if(that.required.hasOwnProperty(modName)){
if (that.required[modName] === 'loading') {
var typeOfString = eval("typeof " + that.modules[modName].varName);
if (typeOfString !== "undefined") {
//module is loaded!
that.required[modName] = 'ok';
that.waitCount = that.waitCount - 1;
if (that.waitCount === 0) {
clearInterval(that.intervalId);
that.onSuccess();
return;
}
}
}
}
}
};
//execute the function twice a second to check if all is loaded:
this.intervalId = setInterval(checkFunction, 500);
//further execution will be in checkFunction,
//so nothing left to do here
}
C.prototype.insert = insert;
//there are more functions here...
return C;
}());
var myLoader = new MYNAMESPACE.Loader();
//some more lines here...
myLoader.insert();
EDIT3:
я планирую сделать это в глобальном пространстве имен в переменной MYNAMESPACE.loadCheck, для простота, так что результат будет, комбинируя с различных ответов и комментариев:
if (MYNAMESPACE.loadCheck.modules[modName].varName in window) {
doSomething();
}
конечно, мне придется обновить класс Loader, где когда-либо «имяПрает» упоминаются.
Является ли это локальной переменной? –
В чем проблема с просто выполнением typeof that.modules [modName] .varName? Можете ли вы опубликовать весь свой код. –
@Alexandre: это код из функции класса загрузчика. Таким образом, «это» относится к экземпляру класса. Код находится в пределах функции класса. – user89021