可能重复:
JavaScript中不带大括号的Lambda函数语法
在处理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()
语句,所以调试简单的语法错误变得异常困难。您会得到所有这些指向Protovis代码中eval()
行的"意外标识符"错误,而没有指示问题发生在您自己的代码中的位置(缺少分号等(。如果你想让你的代码在Firefox之外工作,你必须在特殊的
javascript+protovis
脚本标记中包含所有的代码,这意味着没有外部文件。一旦你开始做任何稍微复杂的事情,你真的想在大多数时候把你的脚本分开。与任何"聪明"的语法一样,它可能会变得非常难以阅读,尤其是当你以意想不到的方式使用它时(例如在方法调用之外(。是的,它很简洁,但易读性是要付出一定代价的。
尽管如此,当我想快速绘制草图时,我仍然会使用它。但大多数时候,我建议坚持使用普通的脚本标记和标准的、卷曲的函数声明。