处理 Protovis - 他们实现了一些没有花括号的奇怪委托函数 - 有人可以为我遮光吗?例子:
vis.add(pv.Label)
.data(cols)
.left(function() this.index * w + w / 2)
.top(0)
.textAngle(-Math.PI / 2)
.textBaseline("middle");
处理 Protovis - 他们实现了一些没有花括号的奇怪委托函数 - 有人可以为我遮光吗?例子:
vis.add(pv.Label)
.data(cols)
.left(function() this.index * w + w / 2)
.top(0)
.textAngle(-Math.PI / 2)
.textBaseline("middle");
一般来说,正如@missingno 链接到的问题中所解释的,这是声明函数的另一种语法,主要由 Firefox 支持。代替:
function() { return "stuff" };
你省略了花括号和return
语句:
function() "stuff";
函数的结尾出现在正常语句可能结束的任何地方——分号 ( ;
)、逗号 ( ,
) 或右括号 ( )
)。
在 Protovis中,有很多情况需要声明简短的单语句匿名函数作为参数传递给方法调用。这是一种常见的模式,以至于该库包含一个解析实用程序,以确保在 Firefox 以外的浏览器中支持上述语法。如果您将 Protovis 代码包含在这样的脚本标签中:
<script type="text/javascript+protovis">
// ...
</script>
脚本将由 Protovis 解析器评估,以确保支持特殊语法。
我的两分钱:这种语法的好处是它非常快(加上所有示例都使用它)。使用 Protovis 的典型脚本涉及大量匿名函数,因此可以节省一些打字时间,而且看起来非常棒。当我第一次开始使用 Protovis 时,我经常使用它——不仅在方法调用中,还在变量声明中。
但是,它有一些非常严重的问题:
因为你的所有代码都是通过 Protovis 解析器运行的,它本质上是修改代码以重新添加return
语句,然后eval()
调试简单的语法错误变得非常困难。您会收到所有这些“意外标识符”错误,这些错误指向eval()
Protovis 代码中的行,但没有指示问题(缺少分号等)在您自己的代码中发生的位置。
如果您希望您的代码在 Firefox 之外工作,您必须将所有代码包含在特殊的javascript+protovis
脚本标签中,这意味着没有外部文件。一旦你开始做任何稍微复杂的事情,你真的希望大部分时间都将你的脚本分开。
与任何“聪明”的语法一样,它可能很难阅读,尤其是当您以意想不到的方式使用它时(例如,在方法调用之外)。是的,它很简洁,但在易读性方面要付出一定的代价。
尽管如此,当我想快速绘制草图时,我仍然使用它。但大多数时候,我建议坚持使用普通的脚本标签和标准的花括号函数声明。