2009-07-31 10 views
8

私のクエリは、 "(function(){...})();"私はプラグインではないことを考えると、例えば "http://piecesofrakesh.blogspot.com/2009/03/downloading-javascript-files-in.html""(function(){...})();"という構文はいつ使用しますか?

(function() {   
    var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
    ]; 

    var sc = "script", tp = "text/javascript", sa = "setAttribute", doc = document, ua = window.navigator.userAgent; 

    for(var i=0, l=s.length; i<l; ++i) { 
    if(ua.indexOf("MSIE")!==-1 || ua.indexOf("WebKit")!==-1) { 
     doc.writeln("<" + sc + " type=\"" + tp + "\" src=\"" + s[i] + 
      "\" defer></" + sc + ">"); 
    } else { 
     var t=doc.createElement(sc); 
     t[sa]("src", s[i]); 
     t[sa]("type", tp); 
     doc.getElementsByTagName("head")[0].appendChild(t); 
    } 
    } 
})(); 

それとも

var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
]; 
... 

ありがとうございました。

+9

正確には何ですか? – Scoregraphic

+8

"私はプラグインではないことを考えると"かわいいです:-) – balpha

+0

申し訳ありませんが、私は英語で非常に悪いです。このスクリプトはプラグインではありません。その場合、この構造体を使用すると便利です(function(){...}();) –

答えて

24

これは、名前の競合を避けるために行われます。

関数を宣言すると、その関数は変数に固有の名前空間を持ちます。直ちに呼び出される関数にコードをラップすることにより、グローバル変数を独自の値で上書きすることを避けることができます。

この場合、sscに値が割り当てられます。グローバルスコープでそれを行い、他のスクリプトがすでに別の目的でこれらの名前の変数を使用していた場合、他のスクリプトが失敗する原因になります。新しいスコープを導入することによって、識別子sscは、グローバルスコープに存在するsscという変数とは異なる(ローカルにバインドされた)変数を参照するようになりました。

+0

あなたのお返事ありがとうございます –

+3

+1その質問を割り引くために... – Kip

2

イディオム(function() {...})();制限範囲を。したがって、最初のケースでは、s(およびsctpなど)は、関数本体の外部にはアクセスできません。後者の場合、あなたはそれにアクセスすることができます。だから(function() {...})();は名前空間の汚染を防ぎます。あなたがそれを必要とするかどうかは別の質問です。あなたは "スコープのjavascript"のようなものをGoogleにしたいかもしれません。素晴らしいarticleがあります。

+0

あなたの答えをありがとう –

3

(function() {...})();は、自己呼び出す匿名関数、つまりすぐに実行される名前のない関数です。 JavaScriptには関数スコープがあるため、自己起動型の匿名関数を使用すると、関数内部の変数の範囲が関数自体に制限され、そうでない場合に発生する可能性のある競合を回避できます。

jQueryでは、自己呼び出す匿名関数が、関数の内部に$というシンボルを持つjQueryオブジェクトを参照するプラグインの作成者によって頻繁に使用されます。たとえば、

(function($) { 

    /* plugin code here */ 

})(jQuery); 
関連する問題