最近、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
が返すものは、初期化が試行された関数として扱われます。
これは主に、複数のファイルを1つのファイルに連結しようとするときのエラーを防ぐためです。
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です