为什么JavaScript需要以";"开头?

TK.*_*TK. 217 javascript jquery jquery-plugins serverside-javascript

我最近注意到,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( $ ){
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*ver 350

我会说,因为脚本经常连接和缩小/压缩/一起发送,所以最后一个人有可能有这样的事情:

return {
   'var':'value'
}
Run Code Online (Sandbox Code Playgroud)

在最后一个脚本;的末尾没有结尾.如果您;在开始时有一个,那么它是安全的,例如:

return {
   'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)
Run Code Online (Sandbox Code Playgroud)
return {
   'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!
Run Code Online (Sandbox Code Playgroud)
return {
   'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你不能将`return`语句作为脚本中的最后一项,是吗?回到顶层没有意义.它必须是别的东西,对吧? (8认同)
  • @ user2357112更重要的是,*a`return`语句之后的代码*没有被执行,所以连接没有意义.至少有一个`}缺失. (3认同)

Jer*_*ard 56

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

  • 我不是百分百肯定,但我和你在一起,杰里. (8认同)

and*_*lrc 12

考虑这个例子:

function a() {
  /* this is my function a */
}
a()
(function() {
  /* This is my closure */
})()
Run Code Online (Sandbox Code Playgroud)

会发生什么,它将被评估如下:

function a() {
  /* this is my function a */
}
a()(function() {})()
Run Code Online (Sandbox Code Playgroud)

所以a返回的东西将被视为一个试图被初始化的函数.

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

a.js

function a() {
  /* this is my function a */
}
a()
Run Code Online (Sandbox Code Playgroud)

b.js

(function() {
  /* This is my closure */
})()
Run Code Online (Sandbox Code Playgroud)

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

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