我最近注意到,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文件中也看到了这种约定。
这样做的优点和缺点是什么?
想想这个例子:
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
我想说的是,由于脚本通常是连接和缩小/压缩/发送在一起的,所以最后一个人有可能会有这样的东西:
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