Protovis - 没有花括号的这些功能是什么?

时间:2011-07-26 14:31:00

标签: javascript syntax protovis

  

可能重复:
  Lambda function syntax in JavaScript without curly braces

处理Protovis - 他们实现了一些奇怪的委托功能,这些功能没有花括号 - 有人可以为我遮挡它吗? 例如:

vis.add(pv.Label)
.data(cols)
.left(function() this.index * w + w / 2)
.top(0)
.textAngle(-Math.PI / 2)
.textBaseline("middle");

1 个答案:

答案 0 :(得分:6)

一般,如question @missingno linked to中所述,这是声明函数的替代语法,主要由Firefox支持。而不是:

function() { return "stuff" };

你省略了花括号和return语句:

function() "stuff";

函数的结尾发生在正常语句可能结束的任何地方 - 分号(;),逗号(,)或紧密括号())。< / p>

在Protovis 中,有很多情况需要声明短的,一个语句的匿名函数作为方法调用的参数传入。这是一种常见的模式,该库包含一个解析实用程序,以确保Firefox以外的浏览器支持上述语法。如果您将Protovis代码包含在脚本标记中,如下所示:

<script type="text/javascript+protovis">
// ...
</script>

该脚本将由Protovis解析器进行评估,该解析器确保支持特殊语法。

我对此的两分钱:这种语法的优点是它非常快(加上所有的例子都使用它)。使用Protovis的典型脚本涉及匿名函数的 lot ,因此这可以为您节省一些打字,而且看起来非常棒。当我第一次开始使用Protovis时,我经常使用它 - 不仅在方法调用中,而且在变量声明中也是如此。

但是,它有一些非常严重的问题:

  • 因为你的所有代码都是通过Protovis解析器运行的,它实际上是通过代码来重新添加return语句然后再eval()语句,所以调试简单的语法变得非常困难错误。你得到所有这些“意外的标识符”错误指向Protovis代码中的eval()行,没有任何迹象表明你自己的代码中出现了问题(缺少分号等)。

  • 如果您希望代码在Firefox之外工作,则必须将所有代码包含在特殊的javascript+protovis脚本标记中,这意味着没有外部文件。一旦你开始做任何边缘复杂的事情,你真的希望在大多数时间保持你的脚本分开。

  • 与任何“聪明”语法一样,它可能变得非常难以阅读,尤其是当您以意想不到的方式使用它时(例如,在方法调用之外)。是的,它很简洁,但是在易读性方面要付出明确的代价。

所有这一切,当我想快速制作草图时,我仍然使用它。但大多数时候,我建议坚持使用普通的脚本标签和标准的,花括号的函数声明。