我最近注意到,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文件中也看到了这种约定。

这样做的优点和缺点是什么?


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


我想说的是,由于脚本通常是连接和缩小/压缩/发送在一起的,所以最后一个人有可能会有这样的东西:

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

想想这个例子:

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