218

;最近、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ファイルでも見られます。

これを行うことの長所と短所は何ですか?

4

3 に答える 3

352

スクリプトはしばしば連結され、縮小/圧縮/一緒に送信されるため、最後の人が次のようなものを持っている可能性があります。

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
于 2010-03-20T01:39:33.807 に答える
57

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

于 2010-03-20T01:39:00.507 に答える
13

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

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

于 2013-06-04T14:33:51.817 に答える