2010-04-08 3 views
3

Как написать этот код 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, где когда-либо «имяПрает» упоминаются.

+0

Является ли это локальной переменной? –

+0

В чем проблема с просто выполнением typeof that.modules [modName] .varName? Можете ли вы опубликовать весь свой код. –

+0

@Alexandre: это код из функции класса загрузчика. Таким образом, «это» относится к экземпляру класса. Код находится в пределах функции класса. – user89021

ответ

3

в JS каждая переменная является свойством, если вы понятия не имеете, свойство это, это window свойство, так что я полагаю, в вашем случае, это может работать:

var typeOFString = typeof window[that.modules[modName].varName] 
if (typeOFString !== "undefined") { 
    doSomething(); 
} 
+0

в противном случае (т. Е. Если вы используете javascript 'with (object) {...} 'или вы находитесь в области * функций *), вы должны искать все объекты, которые могли бы содержать его, последовательно. – ZJR

+1

fyi вы можете использовать «это», а не «окно» –

+0

переменные функции javascript, IIRC, являются свойствами функции, поэтому, если вы делаете: 'function x() {var a = 10;}' вам нужно будет проверить 'имяПерем = 'а'; typeof x [varName]; ' – ZJR

1

Поскольку вы только тестирование для наличие предмета, то вы можете использовать in, а не typeof.

Так что для глобальных переменных, как в ответ Zjr, вы можете искать их на window объекта:

if (that.modules[modName].varName in window) { 
    ... 
} 

Если вам нужно искать для локальных переменных нет никакого способа сделать это без eval. Но это будет признаком серьезного искажения в дальнейшем.

+0

Это не совсем тот же тест. Если переменная была объявлена, но ее значение было _undefined_, то typeof вернет «undefined», но в окне вернет true. – Alsciende

+0

@ Alsciende Я вижу разницу. В случае этого класса это не имело бы значения. – user89021

Смежные вопросы