【问题标题】:Protovis - What are these functions with no curly braces? [duplicate]Protovis - 这些没有花括号的函数是什么? [复制]
【发布时间】:2011-07-26 14:30:59
【问题描述】:

可能重复:
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");

【问题讨论】:

  • 您会在链接的问题中找到更多信息,但请告诉智者:不要这样做!你迟早会遇到这种(漂亮的)语法的麻烦。如果我没记错的话,它也不会通过 JSLint。如果你想写“漂亮”的Javascript,请使用coffeescript

标签: javascript syntax protovis


【解决方案1】:

一般而言,如question @missingno linked to 中所述,这是声明函数的替代语法,主要由 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 脚本标签中,这意味着没有外部文件。一旦你开始做任何稍微复杂的事情,你真的希望大部分时间都将你的脚本分开。

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

话虽如此,当我想快速绘制草图时,我仍然使用它。但大多数时候,我建议坚持使用普通的脚本标签和标准的花括号函数声明。

【讨论】:

  • 非常感谢,现在事情变得有意义了 :) 更多。还发现 this 作为另一种外观 @ 这种难以捉摸的语法...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2021-01-14
  • 1970-01-01
  • 2020-11-05
  • 2019-11-13
  • 2020-05-17
  • 2018-03-01
相关资源
最近更新 更多