2012-03-27 2 views
0

Обновление Код функции/класса хранится в строке, поэтому я не могу назвать ее напрямую. Идея состоит в том, чтобы делать интроспекцию объекта и перечислять его элементы данных, которые работают, когда они являются функциями, но не работают, когда переменная, подобная приведенной ниже, оценивается.eval возвращает имя переменной вместо undefined. (javascript)

Я пытаюсь оценить объект в javascript. Что-то вроде этого.

var myObj { 
    greet: "Greeting", 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 

Идея заключается в том, чтобы быть в состоянии выполнить это в Eval и получить имя переменной каким-то образом (myObj) или созданный объект. Я экспериментировал с различными методами, используя eval, но не могу понять это. Это работает, когда у меня есть что-то вроде этого.

function myObj() { 
    this.greet = "Greeting"; 

    this.myPrint = function() { 
     alert("hello"); 
    } 
}; 

Выполнение eval ("(+ код +") "); где код - это строка, содержащая указанную выше функцию, возвращает myObj() мне.

Обновление 2 Так что в принципе я хочу оценить что-то вроде этого. eval ("var x = 5"); и я пытаюсь получить x. Поскольку его строка оценивается, хотя она добавляется в пространство имен окна, нет возможности расшифровать ее, кроме разбора строки. Теперь это просто простой пример, но, как я уже сказал, это немного сложно с 1-й частью кода. Как я сказал ... eval ("function test() {return 'hello';}"); return test(), который похож на то, что я ожидаю для инструкции «var x = 5».

Есть ли способ сделать это аналогичным образом для 1-го случая, который у меня отсутствует? Thanks

+4

Я не совсем уверен, что вы хотите сделать, но более насущный вопрос: почему вы хотите это сделать? Что вы пытаетесь решить? –

+0

В основном я хочу, чтобы изучить все члены данных класса/функции. Тем не менее, код на самом деле произволен и вставляется в текстовое поле, откуда я должен заглядывать. (Подумайте об этом как о некоторой функции для IDE, которая может отображать все элементы данных). Я знаю, что произвольный код опасен для eval, но это совершенно другое назначение. – ssarangi

+1

Ваш код 'myObj' недопустим javascript. Можно ли предположить, что это опечатка, или это фактический контент, который вам нужно как-то оценить? –

ответ

0

Вы обходите объект без выполнения функции myPrint.

Вы должны были бы сделать что-то вроде

myObj.myPrint() 

Чтобы получить его, чтобы бросить предупреждение.

[править] Для того, чтобы сразу же запустить функцию myPrint изменить код следующим образом:

var myObj = { 
    greet: "Greeting", 

    myPrint: (function() { 
     alert("hello"); 
    })(); 
    }; 
+0

Наверное, я забыл упомянуть, но код для класса/функции фактически хранится в строке. Вот почему я хочу использовать eval на этом. – ssarangi

+0

Обновлен код для выполнения функции. –

0

Вы пытаетесь динамически вызвать функцию обратного вызова?

var myObj = { // fixed this line of code as it was missing the = 
    greet: "Greeting", // replaced ; with , 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 
console.log(eval(myObj)); // returns obj as expected. 

Если я прав в своем предположении, что вам нужно будет использовать кронштейн обозначения и EVAL не требуется

Так что, если вы проезжали строку он будет выглядеть следующим образом:

var str = 'myPrint'; 

var strTwo = 'greet' 

myObj[str](); // to execute the function 

myObj[strTwo]; // now contains "Greeting" 

Какие будет выполнять эту функцию.

Надеюсь, что это поможет!

Tim

EDIT:

var myObj = 'var myObj = { greet: "Greeting", myPrint: function() { alert("hello"); } }' 

console.log(eval(myObj)); 
myObj.myPrint(); 

Тогда это то, что вы хотите, если это не работает, это означает, что вы не спасаясь вашу строку правильно:

http://jsfiddle.net/XtyHh/

+0

Спасибо, Тим. Тем не менее, проблема в том, что весь код для «var myObj = {...}» находится в строке. Это проблема, с которой я столкнулся. – ssarangi

+0

'myObj [str];' ничего не выполнит. 'myObj [str]();' будет. – jbabey

+0

ssarangi См. Обновление ... –

0

A код :

var sCode = '{ great: "Greating", myPrint: function() { alert("hello!"); } }', 
    oObj = eval("(" + sCode + ")"); 

oObj.myPrint(); // alert "hello" 
console.log(oObj.great); // prints "Greating" 
+0

Здесь sCode определен за пределами строки. То, что я ожидаю, это нечто вроде var code = "var x = {greet: 'greeting'}; Однако выполнение этого с помощью eval ("(+ + code" + ")") не работает – ssarangi

+0

вам не разрешено использовать «var x» с 'eval()' –

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