为什么JS eval()仅返回对象的值

时间:2017-03-13 02:41:54

标签: javascript node.js eval

如果我这样做:

var x = eval('{a:"b"});
console.log(x); // -> "b"

我得到的只是对象中的值(" b"),而不是键/属性,或整个对象本身,这很奇怪。

但是当我这样做时:

var x = eval('(function self(){return {a:"b"}})()');
console.log('x'); //  -> {a:'b'}

现在它似乎给了我所期望的整个对象。但为什么会这样呢?为什么我需要将它包装在(自执行)函数中?

我正在考虑使用eval从字符串创建一些对象,但需要更好地了解它是如何工作的。

1 个答案:

答案 0 :(得分:3)

那是因为{a:"b"}语句as-is代表以下内容:

  1. { ... }
  2. 分隔的代码block
  3. A label a:
  4. 字符串文字"b"
  5. 后者是唯一产生结果的表达式。

    AST探险家也是如此:https://astexplorer.net/#/gist/909bebf...

    要返回一个对象,首先需要将其转换为表达式,如:括在括号中:eval('({a:"b"})')

    但是“我正在考虑使用eval从字符串创建一些对象”的整个想法听起来很可疑。