【问题标题】:eval returning variable name instead of undefined. (javascript)eval 返回变量名而不是未定义。 (javascript)
【发布时间】:2012-03-28 14:17:02
【问题描述】:

更新 函数/类的代码存储在一个字符串中,这就是我不能直接调用它的原因。这个想法是对对象进行自省并枚举其数据成员,当它是一个函数时,它可以工作,但当像下面这样的变量被评估时,它就不起作用了。

我正在尝试在 javascript 中评估一个对象。像这样。

var myObj {
   greet: "Greeting",

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

我们的想法是能够在 eval 中运行它并以某种方式获取变量名 (myObj) 或创建的对象。我已经使用 eval 尝试了各种方法,但无法弄清楚这一点。当我有这样的东西时,这很有效。

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

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

运行 eval("(" + code + ")");其中代码是包含上述函数的字符串,将 myObj() 返回给我。

更新 2 所以基本上我想评估这样的事情。 eval("var x = 5");我想得到x。由于它是一个正在评估的字符串,即使它被添加到窗口命名空间,除了解析字符串之外,没有办法对其进行解密。现在这只是一个简单的例子,但正如我所说,第一段代码有点困难。就像我说的... eval("function test() { return 'hello'; }"); return test() 这类似于我对“var x = 5”语句的期望。

对于我失踪的第一种情况,是否有类似的方法? 谢谢

【问题讨论】:

  • 我不太确定你想做什么,但更紧迫的问题是为什么你想这样做?你想解决什么问题?
  • 基本上我想反省一个类/函数的所有数据成员。但是,代码实际上是任意的,并且被粘贴到我必须自省的文本框中。 (可以将其视为可以显示所有数据成员的 IDE 的一种功能)。我知道在 eval 上运行任意代码很危险,但这是出于完全不同的目的。
  • 您的 myObj 代码不是有效的 JavaScript。可以假设这是一个错字,还是您需要以某种方式评估的实际内容?
  • 对不起,克里斯,这是一个错字。

标签: javascript


【解决方案1】:

一个代码:

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

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

【讨论】:

  • 这里sCode是在字符串之外定义的。我期待的是类似 var code = "var x = { greet: 'greeting' };"但是,用 eval("(" + code" + ")") 这样做是行不通的
  • 你不能将“var x”与eval()一起使用
【解决方案2】:

您是否尝试动态调用回调?

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 myObj = 'var myObj = { greet: "Greeting", myPrint: function() { alert("hello"); } }'

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

如果这不起作用,这就是你想要的,这意味着你没有正确地转义你的字符串:

http://jsfiddle.net/XtyHh/

【讨论】:

  • 谢谢蒂姆,但是,问题是“var myObj = {...}”的整个代码都在一个字符串中。这就是我面临的问题。
  • myObj[str]; 不会执行任何操作。 myObj[str](); 会。
  • jbabey 你是对的,我只是在说明如何在 obj 中引用任意数量的方法......即字符串不需要 () 就像在问候语中一样。感谢更新我编辑了我的示例
  • 这很有趣。但这样做的原因是因为您的变量名称与字符串中的变量名称相同。所以在全球评估中,我猜这个优先。但是,如果您执行 var code = "var myObj ..." 之类的操作,它将无法正常工作。但这绝对很有趣。但是不解析就无法知道变量名。
  • jsfiddle.net/XtyHh - 这就是我想要做的。 eval_code 仍未定义。但是,我希望它以某种方式自省 eval_code 的属性并获取其数据成员。
【解决方案3】:

您在不执行 myPrint 函数的情况下评估对象。

你需要做类似的事情

  myObj.myPrint()

让它发出警报。

[编辑] 要立即运行 myPrint 函数,请将您的代码更改为:

  var myObj = {
    greet: "Greeting",

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

【讨论】:

  • 我想我忘了提及,但类/函数的代码实际上存储在一个字符串中。这就是我想对此使用 eval 的原因。
猜你喜欢
  • 2012-01-16
  • 2019-05-03
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多