我最近注意到,在网络上有很多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正在恢复将被作为一个试图进行初始化函数处理。

这是主要是为了防止错误试图乘文件Concat的到一个文件中时:

<强> a.js

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

<强> b.js

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

如果我们Concat的这些文件放在一起会引起问题。

因此,因此要记得把你的;(面前,也许还有其他一些地方。顺便说一句。 var a = 1;;;var b = 2;;;;;;;;;var c = a+b;是完全有效的JavaScript

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top