【问题标题】:Javascript - eval() `{}` expressionJavascript - eval() `{}` 表达式
【发布时间】:2012-03-30 12:47:47
【问题描述】:

为什么不能按原样使用eval() 评估像"{opacity: 1.0, width: '132px'}" 这样的字符串?

eval("{opacity: 1.0, width: '132px'}");

// invalid label
// {opacity: 1.0, width: '132px'}
// ---------------ꜛ

eval("v = {opacity: 1.0, width: '132px'}");

// works!

【问题讨论】:

    标签: javascript eval


    【解决方案1】:

    为什么不能按原样使用 eval() 评估像 "{opacity: 1.0, width: '132px'}" 这样的字符串?

    因为文本出现在预期语句或块的位置,而不是表达式,因此{ 表示block 的开头,而不是object initializer 的开头。 (然后opacity: 被解释为label 后跟语句分隔符[逗号],然后width: 看起来像另一个标签,在此处无效。)

    将它放在括号中会更改解析上下文,以便预期表达式,因此 { 打开初始化程序。 (这与您看到用括号括起来的自动执行匿名函数的原因相同,例如 (function(){ ... })(); 而不仅仅是 function(){ ... }();。)

    【讨论】:

    • 从技术上讲,原因是语法在解析Statement时更喜欢规则“Block”而不是规则“ExpressionStatement”
    【解决方案2】:

    为什么不能按原样使用 eval() 评估像 "{opacity: 1.0, width: '132px'}" 这样的字符串?

    因为{opacity: 1.0, width: '132px'} 是无效的 JavaScript。尝试按原样放置此语句,您将得到一个 js 错误。另一方面,v = {opacity: 1.0, width: '132px'} 是有效的 javascript。

    【讨论】:

    • {opacity: 1.0, width: '132px'} 是完全有效的 javascript。
    • @thg435,你确定吗?以下为我生成了一个 javascript 错误:jsfiddle.net/n4yMx
    • 这归结为你对“有效”的定义,我猜。
    • @thg435,是的,我对有效的定义是 javascript 解释器(这是 eval 函数所做的)认为是有效的 javascript。你的定义是什么?
    • 你的定义很好,只是少了一个名词。应该是:“一个有效的 javascript program 是什么等等”。
    【解决方案3】:

    试试这样的:

    eval("({opacity: 1.0, width: '132px'})");
    

    【讨论】:

    • 正确答案。这是因为{...} 是一个无效的javascript 表达式,但(...) 是有效的。
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-10-25
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多