ind*_*vil 21 javascript json eval
你能告诉我这种特定语法结构的原因吗?
eval('(' + jsonString+ ')')
Run Code Online (Sandbox Code Playgroud)
解析json文本时.克罗克福德说:" 文本必须用parens包装,以避免绊倒JavaScript语法中的歧义." 在这里.那是什么意思?
我们能避免吗?
CMS*_*CMS 25
Crockford引用的语法歧义是,如果在表达式上下文中找不到打开的花括号,它将被识别为块,而不是像对象文字的开头.
例如:
{"foo": "bar"} // SyntaxError
Run Code Online (Sandbox Code Playgroud)
会给你一个语法错误,因为它会被解释为一个块,带有字符串文字"foo",以及令牌的意外用法:
.
另一方面,正式称为分组运算符的括号只能计算表达式,因此我们不会有任何语法歧义,因为只能在语句上下文中使用块.
({"foo": "bar"})
Run Code Online (Sandbox Code Playgroud)
编辑: @ el.pescado提出了一个有趣的问题:
你能解释为什么eval('{}')未定义?
ECMAScript描述了一个内部类型来解释语句的行为,它被称为完成规范类型.
于完成类型的值是的形式的三元组(type, value, target)
,其中type
可以是normal
,break
,continue
,return
,或throw
.
value
可以是任何语言值empty
,以及target
任何标识或empty
.
空块(生产Block : {}
)显式返回以下完成:
Return (normal, empty, empty).
Run Code Online (Sandbox Code Playgroud)
该eval
函数在执行代码并退出新创建的执行上下文后,检查已评估代码的结果完成情况,在步骤7中,我们可以看到,undefined
如果完成类型为normal
且完成值为,则显式返回empty
:
...
7-如果result.type正常且其完成值为空,则返回undefined值.
...
归档时间: |
|
查看次数: |
3229 次 |
最近记录: |