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

我最近注意到Web上的很多JavaScript文件都以a ; 紧随评论部分。

例如, 这个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文件中看到这个约定。

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

我会说,因为脚本经常被串联和缩小/压缩/发送在一起,最后一个人有这样的机会:

 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.js

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

b.js

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

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

所以记得把你的; (也可能还有其他一些地方)。btw。var var a = 1;;;var b = 2;;;;;;;;;var c = a+b;是完全有效的JavaScript