eval返回变量名,而不是未定义的。(javascript)

eval返回变量名,而不是未定义的。(javascript),javascript,Javascript,更新 函数/类的代码存储在字符串中,这就是我无法直接调用它的原因。其思想是对对象进行内省,并枚举其数据成员,当对象是函数时,这些数据成员起作用,但当对下面这样的变量求值时,这些数据成员不起作用 我试图用javascript计算一个对象。像这样的 var myObj { greet: "Greeting", myPrint: function() { alert("hello"); } }; function myObj() { this.greet =

更新 函数/类的代码存储在字符串中,这就是我无法直接调用它的原因。其思想是对对象进行内省,并枚举其数据成员,当对象是函数时,这些数据成员起作用,但当对下面这样的变量求值时,这些数据成员不起作用

我试图用javascript计算一个对象。像这样的

var myObj {
   greet: "Greeting",

   myPrint: function() {
      alert("hello");
   }
};
function myObj() {
   this.greet  = "Greeting";

   this.myPrint = function() {
      alert("hello");
   }
};
我们的想法是能够在eval中运行它,并以某种方式获得变量名myObj或创建的对象。我用eval尝试了各种方法,但无法解决这个问题。当我有这样的东西时,它就起作用了

var myObj {
   greet: "Greeting",

   myPrint: function() {
      alert("hello");
   }
};
function myObj() {
   this.greet  = "Greeting";

   this.myPrint = function() {
      alert("hello");
   }
};
运行eval+代码+;其中code是一个字符串,包含上述函数,它将myObj返回给我

更新2 所以基本上我想评估一下这样的东西。 evalvar x=5;我想得到x。因为它是一个正在求值的字符串,即使它被添加到窗口名称空间中,除了解析字符串之外,也无法对其进行解密。这只是一个简单的例子,但正如我所说,第一段代码有点难。正如我所说。。。 evalfunction测试{返回'hello';};返回测试,类似于我对var x=5语句的期望

对于我遗漏的第一个案例,有没有类似的方法?
感谢您在不执行myPrint函数的情况下评估对象

你需要像这样做

  myObj.myPrint()
让它发出警报

[编辑]要立即运行myPrint功能,请将代码更改为:

  var myObj = {
    greet: "Greeting",

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

您正在尝试动态调用回调吗

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"
它将执行该功能

希望有帮助

提姆

编辑:

如果这不起作用,则表示您没有正确转义字符串:

代码:

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

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

我不太清楚你想做什么,但更紧迫的问题是你为什么要这样做?你想解决什么问题?基本上我想内省类/函数的所有数据成员。然而,代码实际上是任意的,并且被粘贴到一个文本框中,我必须从中进行反思。可以将其视为IDE的一种功能,它可以显示所有数据成员。我知道在eval上运行任意代码是危险的,但这完全是为了另一个目的。你的myObj代码不是有效的javascript。可以安全地假设这是一个输入错误,或者是您需要以某种方式评估的实际内容吗?对不起,Chris,这是一个输入错误。我想我忘了提到,但是类/函数的代码实际上存储在字符串中。这就是我想在上面使用eval的原因。谢谢Tim,但是问题是var myObj={…}的整个代码都是字符串。这就是我面临的问题;不会执行任何事情。myObj[str];你是对的,我只是简单地介绍了如何在对象中引用任意数量的方法。。。在问候语中不需要字符串。感谢您的更新,我编辑了我的示例,非常有趣。但之所以这样做是因为变量名与字符串中的变量名相同。因此,在全球评估中,我想这一个有优先权。但是,如果您执行类似var code=var myObj的操作。。。这行不通。但那确实很有趣。但是,如果不进行解析,就无法知道变量名。-这就是我想做的。评估代码仍然未定义。但是,我希望它以某种方式反思eval_代码的属性,并获取其数据成员。我所期望的是类似var code=var x={greet:'greeting'};但是,使用eval+code+执行此操作不起作用您不允许在eval中使用var x