为什么eval('('+ jsonString +')')在parsingjsonstring时需要打开引号和括号
你能告诉我这个特定的语法结构的原因吗?
eval('(' + jsonString+ ')')
parsingjson文本时。 克罗克福德说:“ 文本必须包装在parens中,以避免绊住JavaScript语法的歧义 。” 这里 。 这意味着什么?
我们可以避免吗?
Crockford提到的语法歧义是,如果在expression式上下文中没有find开放的大括号,它将被识别为一个块 ,而不像对象文字的开始。
例如:
{"foo": "bar"} // SyntaxError
会给你一个语法错误,因为它会被解释为一个块,一个string文字“foo”,以及令牌的意外使用:
。
另一方面,正式名为分组操作符的括号只能计算expression式,因此我们不会有任何语法歧义,因为只能在语句上下文中使用块。
({"foo": "bar"})
编辑: @ el.pescado提出了一个有趣的问题:
你能解释为什么eval('{}')是不确定的吗?
ECMAScript描述了一个内部types来解释语句的行为,它被称为完成规范types 。
Completiontypes的值是(type, value, target)
forms的三元组,其中type
可以是normal
, break
, continue
, return
或throw
。
value
可以是任何语言值或empty
值,并且指定任何标识符或empty
。
一个空白块(生产Block : {}
)显式返回以下完成:
Return (normal, empty, empty).
eval
函数在执行代码之后,退出新创build的执行上下文,检查评估代码的结果完成情况,并在步骤7中看到,如果完成typesnormal
且完成值为empty
:
…
如果result.type是正常的,并且它的完成值是空的,则返回undefined值。
…
对象字面量需要用括号括起来,以在eval
上下文和其他上下文中正确评估:
eval('{}')
是未定义的,例如。 而eval('(' + '{}' + ')' )
计算结果为Object。
如果你在控制台尝试了这个,例如: {"foo":"bar"}
它会向你扔出一个无效的标签。 用圆括号把它包起来,它就成了一个有效的expression式。
@ el.pescado,由eval执行后的string应该是javascript可以理解的。 即,如果您将以上string分配给variables,如下所示
eval('var foo1 = {“foo”:“bar”}'); foo1.foo会返回吧
所以,我的假设是,因为没有像JavaScript中的“{”开头那样的陈述,它正在抛出错误。