web-dev-qa-db-ja.com

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( $ ){

ファイルが;で始まる必要があるのはなぜですか?サーバー側のJavaScriptファイルにもこの規則があります。

これを行うことの利点と欠点は何ですか?

217
TK.

スクリプトはしばしば連結され、縮小/圧縮/送信されるため、最後の男が次のようなことをした可能性があります。

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
351
Nick Craver

私は確信しています(確信はありませんが、私を責めないでください)、これにより、別のファイルからの以前のステートメントが閉じられることが保証されます。最悪の場合、これは空のステートメントになりますが、最良の場合、未完成のステートメントが実際に上から来たときにこのファイルのエラーを追跡しようとすることを回避できます。

56
Jerry Bullard

この例を考えてみましょう:

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です

12
andlrc