【问题标题】:What a strange syntax?多么奇怪的语法?
【发布时间】:2011-07-26 12:04:52
【问题描述】:

我在 JQuery 网站上发现了未知的代码构造。经过一些格式化后,它看起来像:

function (a,c) {
    c==null && (c=a,a=null);
    return arguments.length>0
        ? this.bind(b,a,c) 
        : this.trigger(b)
}

函数的第一行是什么意思?是不是有什么技巧或者标准的JS代码构造?

【问题讨论】:

  • 它是 Java、php、Javascript 和任何其他语言的标准
  • 如果您要查看 jQuery 代码,请查看开发副本而不是缩小版。 Here's a link 到开发副本。
  • @Tom:comma operator 在 JavaScript 中与在其他具有 C 风格语法的语言中不同。
  • 哇,那些代码压缩器太激进了——它只比if(c==null){c=a;a=null}短一个字符

标签: javascript


【解决方案1】:

这是一种使用布尔短路评估仅在第一个评估为真时才执行后半部分的技巧。 Perl 通常有这个:

<something> or die

如果第一条语句失败,程序结束。

读作

if (c == null) { c = a; a = null; }

【讨论】:

  • 逗号使两个命令都无需分号即可执行。
  • 这反过来又允许两个语句在单行中执行,这比if语句节省了字符。
  • @Gunslinger_ : 实际上快了多少?
  • Python 还允许您使用A or B 等同于A != null &amp;&amp; A == true ? A : B。虽然在 Python 中你会说是A if A != None and A == True else B。不过,我可能会遗漏 Python 用法的一些微妙之处。
  • @JAB 可以在 javascript 中使用
【解决方案2】:

这样写太丑了

if(c==null) {
  c = a;
  a = null;
}

这利用了布尔值&amp;&amp; 的第二部分当且仅当第一部分的计算结果为真时才会执行的事实。

【讨论】:

  • 非常难看。对许多开发人员来说非常不直观。你能找到写它的人并踢他们吗?
  • @Schroedingers Cat:因为变量被命名为abc,这个代码可能是由代码压缩器生成的。 jQuery currently seems 使用 UglifyJS
  • 丑化?这解释了很多,不是吗? ;D
【解决方案3】:

该表达式使用两个 JavaScript 功能:

因此表达式等价于:

if (c == null) {
    c = a
    a = null
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多