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( $ ){

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

这样做有什么好处和坏处?

4

3 回答 3

352

我会说,由于脚本经常被连接并缩小/压缩/一起发送,所以最后一个人有可能有类似的东西:

return {
   'var':'value'
}

在最后一个脚本的末尾没有最后一个;。如果你;的开头有一个,它是安全的,例如:

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
于 2010-03-20T01:39:33.807 回答
57

我相信(虽然我不确定,所以请不要攻击我)这将确保关闭来自不同文件的任何先前声明。在最坏的情况下,这将是一个空语句,但在最好的情况下,当未完成的语句实际上来自上面时,它可以避免尝试追踪该文件中的错误。

于 2010-03-20T01:39:00.507 回答
13

考虑这个例子:

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

将会发生的是,它将被这样评估:

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

因此,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

于 2013-06-04T14:33:51.817 回答