【问题标题】:Function expression ending with ; vs. not以 ; 结尾的函数表达式与不
【发布时间】:2010-12-08 23:08:43
【问题描述】:

在阅读其他代码时,我看到编写的函数既以分号结尾,也不以分号结尾。

与:

var testFunction = function() {
  // magic happens here
};

没有:

var testFunction = function() {
  // magic happens here
}
  • ?:一个比另一个更“技术上”正确吗?
  • ?:有速度优势吗?
  • ?:浏览器是否不在乎,所以它只是从另一种语言或 JavaScript 函数过去需要的旧格式中汲取的一种风格?
  • ?: #{问题我没有考虑在这里问,但你认为我应该问}

更新:我也发现这非常有用 => https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

【问题讨论】:

  • 我刚刚对此进行了测试,发现在我最喜欢的浏览器中,没有分号的版本明显更快!
  • @Marcel,很有趣!您使用什么代码进行测试,结果如何?
  • 你可能会发现以下关于分号插入的有趣 - inimino.org/~inimino/blog/javascript_semicolons
  • 添加到您的机器/浏览器上的测试...jsperf.com/function-assignment-semicolon 在 Chrome 8 上对我来说几乎是一样的
  • 迈克,你确实听到了我声音中的讽刺,不是吗?

标签: javascript coding-style


【解决方案1】:

从根本上讲,您所拥有的是一个 assignment 语句和according to the Google Javascript Style Guide,所有语句都应以; 结尾。尤其是 assignment 语句。 JSLint 需要 ; 否则不会通过。

【讨论】:

【解决方案2】:

定义函数有两种方式:

var testFunction = function() {
  // magic happens here
};

function testFunction(){
  // magic happens here
}

我认为,当您使用语句(第一个选项)定义它时,最好以 ; 结尾,而不是作为函数定义(第二个选项)。

JS 解析器非常灵活,所以 YMMV。

【讨论】:

  • YMMV == 您的里程可能会有所不同
  • 第一个例子是函数声明,不是函数声明,这是Mozilla专有的东西。
  • 第一个例子用于在闭包中定义,适用于所有A级浏览器...
【解决方案3】:

我认为让; 分号终止函数在技术上是正确的,因为您正在执行声明性语句。尽管语法没有要求,但通常接受变量声明以; 分号结束。在这种情况下,“变量”恰好是一个函数。

// As you do this
var i = 0;

// Also do this
var obj = function() {
  // aforementioned magic
};

还可能值得注意的是,在声明对象时,每个字段都用逗号分隔,

var obj = function() {
  magic1 : function() {},
  magic2 : function() {}, // <-- Similarly, comma is optional here...sorta
                          //     See Marcel's comment below.
};

当然,对于简单的函数声明,可以被认为是“技术上更正确”,因为它不是线性执行的语句。 (请参阅 Google 风格指南中的优秀 counterpoint 等)在这种情况下,分号 ; 被解释为“空”代码行,而不是表达式终止标记。

对于简单的函数声明,不要使用它:

function doMagic() {
  // aforementioned magic
}

【讨论】:

  • 你可能指的是函数 declarations 而不是“全局函数”,而第二个只是一个函数 expression;你没有在那里定义一个闭包(即,不是严格意义上的闭包)。
  • NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!不是尾随逗号,也不是,IE 会创建一个空元素,结果很糟糕。
  • @Marcel,不是真的,对吧?请告诉我这不是真的。请?就像,这是世界已经过去的一些 IE6 错误,对。请,哦,好吗?
  • 嗯,我可能有点太快了,因为这通常适用于数组,但快速搜索发现它also applies to objects(并将“数组”替换为“对象”)。另见this NetBeans bug
  • 太恶心了!当我第一次学习 Python 时,我养成了“尾随逗号”的习惯。感谢您今天教我一些东西,即使这只是另一个 IE 荒谬的例子!
【解决方案4】:

一个比另一个更“技术上”正确吗?

没有。从技术上讲,您正在为恰好是函数的变量赋值,就像var x = 10 一样。您可以使用或不使用; 来声明它,这两种方式都同样正确。

一个人有速度优势吗?

如果有明显差异,我会感到非常惊讶。

浏览器是否不在乎,所以它只是从另一种语言或 JavaScript 函数曾经需要的旧格式中汲取的一种风格?

浏览器不在乎,这只是语言的一个怪癖。

我没有考虑在这里问但你认为我应该问的问题

你说哪个更具可读性?我个人更喜欢以; 结束陈述,因为它感觉正确并且更清楚你在做什么。我来自 Java 领域,这是必需的,但即使不是,我认为用 ; 明确结束语句会更清楚,所以我将其包含在内。

但是,就像任何代码风格的争论一样,它很快就变成了个人选择的问题,并且会发生激烈的争吵。谨慎行事。

【讨论】:

  • 使用分号来结束函数表达式不仅更清楚,而且对于 JSLint 也是强制性的,更重要的是,在您缩小代码时。
  • @Marcel,关于 JSLint 的好点子。我在 C++ 上“长大”,其中唯一的分号合法地跟随在结束 } 之后,其中 1)类定义结束和 2)do...while(); 语句结束。从这个背景来看,用分号终止函数似乎是多余的,尽管不一定是“错误的”。
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多