2012-10-02 9 views
28

可能性の重複:
How do JavaScript closures work?この方法で無名関数に引数を渡す目的は何ですか?

私は、Google Closure Compilerで遊んで、それがどうなるか見てランダムコードに入れていました。

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

"Hello World"は、それに先立つ無名関数へmsgとして渡された引数があることが表示されます:

それはこのような何かを見て、私の関数のいずれかを書き直しました。私はしばらくの間、それを見ていた、と私はのようなものに見えるjQueryのプラグインに似た何かを見ていたことを考えていた:今 $との競合の範囲で、私に多くの意味を成して

(function($) { 
    ... 
})(jQuery); 

を。しかし、このような無名関数に引数を渡す主な理由または目的は何ですか?関数内の引数として引数を単に定義するのはなぜですか?このような関数を書くことに、パフォーマンスや柔軟性の利点はありますか?

+0

この特定のコードについては、本当の理由はありません。あなたは単に 'console.log(" hello ");'を実行することができます。しかし、通常は、内部で作成され、エクスポートされたいくつかの関数でのみアクセス可能なローカル変数を作成することがあります。 –

+0

私はそのフォームになった元のコードを見るのが好きです。私はあなたがADVANCED_OPTIMIZATIONSを有効にしていれば、その機能を完全に取り除くことになるでしょう。 –

+0

@ user1689607この機能は少し違っていました。私はそれをきれいにするために簡潔にしました。この具体的な例よりもコンセプトについてもっと疑問がある –

答えて

10

スコープにも1つの大きな違いがあります。次のコード:第二のコードは、それがもはや必要とされた後、変数を残さないが、他の部品と干渉する可能性があるため

var msg = "Hello World!"; 
console.log(msg); 

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

は、いくつかの状況でクリーンな名前空間の汚染の面でこれよりもありますコードの

これは、他の関数の外で前述のコードを実行する場合に特に重要です。そのような場合は、msg変数がページ上のグローバル変数として使用できます。

+0

しかし、あなたの2番目の例を匿名関数でラップするだけでは、どのように違うのでしょうか?変数は最終的に死ぬだろう –

+0

私は彼がこのような何かを意味する印象を受けていた:http://jsfiddle.net/cv5Jp/ –

+0

@KevinB右、あなたのフィドルと私が投稿した機能の違いは何ですか? –

0

基本的には、あなたのコードが他の人々のバールと衝突するのを防ぐために、あなたのコードをこのままにしておくことをお勧めします。(function(){/*code*/}());

私はクロージャコンパイラが得意なのは、var =の5文字を​​保存していると思います。

0

これはコンテキストによって異なります。コンパイラが関数をインライン化しようとしない(スコープ関数に "eval"が含まれている場合など)いくつかの条件があります。これがグローバルスコープでADVANCEDモードで実行されている場合、インライン関数をインライン化しようとするのをコンパイラが停止した後にインライン展開することができます(またはインラインコードにバグがあり、 ADVANCEDモードでコンパイラを使用してサンプル出力を実行すると、次のようになります。

console.log("Hello World!"); 
関連する問題