【问题标题】:Weird Javascript expression奇怪的 Javascript 表达式
【发布时间】:2010-11-17 16:30:42
【问题描述】:

我试图了解Protovis 的工作原理,但偶然发现了这样的代码:

force.node.add(pv.Dot)
    .size(function(d) (d.linkDegree + 4) * Math.pow(this.scale, -1.5)) // notice this
    .fillStyle(function(d) d.fix ? "brown" : colors(d.group)) // and this
    .strokeStyle(function() this.fillStyle().darker()) // and even this
    .lineWidth(1)
    .title(function(d) d.nodeName)
    .event("mousedown", pv.Behavior.drag())
    .event("drag", force);

我尝试滚动自己的短函数,如下所示:

(function(a) a+2)

询问声明为function(){stuff();} 的匿名函数。有问题的代码看起来像 function() stuff; 并且可以工作。我想知道为什么。我不想了解myvar = function(a){return a+1;} 之类的构造,而是了解myvar = (function(a) a+1) 之类的构造。请仔细看上面的代码。

但是,正如我所怀疑的,它引发了语法错误。

这样的代码如何工作?

注意:protovis 代码确实按预期工作。

【问题讨论】:

标签: javascript function syntax


【解决方案1】:

这是 JavaScript 1.8 中引入的表达式闭包。它是 ECMAScript 的扩展。

https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8

【讨论】:

  • 最后。一个理解问题的答案!
  • @lincolnk - 为了兼容性,这是真的,但这样的东西真的应该内置到 ECMAScript 中。
  • 为什么?用更短的代码来交易明确性似乎是一种糟糕的交易。
  • @lincolnk - 我属于认为核心语言功能应该尽可能短但不能更短的阵营。你有没有见过一个相当大的项目没有到处使用 lambda?由于function 关键字,表达式闭包语法仍然有点繁重,但大部分噪音都被消除了。相同的想法在 C# 中与 lambda 表达式一起使用。
  • 我完全支持短 lambda。但这听起来仍然是个坏主意,特别是因为他们没有缩短function,这与大括号和return 一样长。真正的解决方案:使用 Coffeescript :)
【解决方案2】:

Protovis 也有自己的代码来处理您正在运行的浏览器尚不支持表达式闭包格式的情况,这里:http://vis.stanford.edu/protovis/jsdoc/symbols/src/src_pv-internals.js.html

【讨论】:

  • 谢谢!我很难确定<script type="text/javascript+protovis"> 的含义以及它是如何工作的。我错误地认为这与 XHTML 中的 XML 命名空间有关...
【解决方案3】:

这是一个表达式闭包,看这个:

这是有效的 jsfiddle:

【讨论】:

    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2018-10-30
    • 2015-08-05
    相关资源
    最近更新 更多