JavaScriptが「;」で始まる必要があるのはなぜですか?


218

最近、ウェブ上の多くの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ファイルでも見られます。

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

回答:


352

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

return {
   'var':'value'
}

最後のaなしの最後のスクリプト;の最後。あなたが;あなたのものを最初に持っているなら、それは安全です、例:

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

8
あなたが実際に持つことができないreturn、スクリプトの中で最後のものとして声明をすることができますか?トップレベルに戻ることは意味がありません。それは何か別のものでなければならないでしょう?
user2357112はモニカの2014

3
@ user2357112さらに、ステートメントののコードreturnは実行されないため、連結しても意味がありません。少なくとも}行方不明です。
ロバート

57

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


9
私は100%確信はありませんが、私はあなたと一緒に、ジェリーと一緒にいます。
okw '20年

12

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.