为什么JavaScript需要以“;”开头?


218

我最近注意到,Web上的许多JavaScript文件都是在;注释部分之后立即开始的。

例如,此jQuery插件的代码开头为:

/**
 * jQuery.ScrollTo
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008                                      
 .... skipping several lines for brevity...
 *
 * @desc Scroll on both axes, to different values
 * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
 */
;(function( $ ){

为什么文件需要以;?开头?我也在服务器端JavaScript文件中看到了这一约定。

这样做的优缺点是什么?

Answers:


352

我要说的是,由于脚本通常是串联在一起的,因此必须最小化/压缩/发送在一起,所以最后一个人有可能遇到以下情况:

return {
   'var':'value'
}

在最后一个脚本的末尾,而末尾没有a ;。如果您;刚开始使用,则很安全,例如:

return {
   'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)

return {
   'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!

return {
   'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm

8
您实际上不能将return语句作为脚本中的最后一件事,可以吗?返回顶层没有任何意义。一定是其他东西吧?
user2357112支持Monica 2014年

3
@ user2357112更是如此,语句的代码return不会被执行,因此连接起来没有任何意义。至少有一个}失踪者。
罗伯特

57

我相信(尽管我不确定,所以请不要猛扑我),这可以确保关闭其他文件中的所有先前语句。在最坏的情况下,这将是一个空语句,但在最好的情况下,当未完成的语句实际上来自上方时,它可以避免尝试查找此文件中的错误。


9
我不确定100%,但是杰里,我愿意和你一起。
okw

12

考虑以下示例:

function a() {
  /* this is my function a */
}
a()
(function() {
  /* This is my closure */
})()

将会发生的是,它将像这样进行评估:

function a() {
  /* this is my function a */
}
a()(function() {})()

那有什么 a返回的内容将被视为试图初始化的函数。

这主要是为了防止在尝试将多个文件合并为一个文件时出错:

a.js

function a() {
  /* this is my function a */
}
a()

b.js

(function() {
  /* This is my closure */
})()

如果我们将这些文件合并在一起,将会导致问题。

因此,请记住将您;放在(其他地方之前。顺便说一句。var a = 1;;;var b = 2;;;;;;;;;var c = a+b;是完全有效的JavaScript

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.