2012-04-25 6 views
1

私はJSONにコメントを追加しようとしていましたが、JSONを有効にする処理を行う前にそれらを取り除くthis scriptが見つかりました。 JSON.minify()関数を利用できるようにする方法を理解しようとしていますか?グローバル(function(global){some code ..})(this)は何をしますか?

は、それは私には奇妙である完全

(function(global){ ... 

から始まります。私はMDNで "global is a property of a RegExp instance, not the RegExp object"を見つけましたが、私はそれがまったくこのスクリプトでどのように動作するのか分かりません。

+1

これはパラメータです。 – SLaks

+0

関数はグローバルコンテキストで呼び出されます。したがって、 'this'引数は' global'パラメータに代入されるグローバルオブジェクトです。 –

答えて

2

このコード:

(function(global){ 
    // your code here 
    // referring to the variable named "global" in this scope 
    // will be a reference to the default javascript global object 
})(this); 

この自己実行機能内にあるすべてのコードに対するglobal標識引数に(それがあるかもしれない何でも)グローバルオブジェクトを割り当てるための構築物です。

自己実行機能は、別の実行スコープを定義するために使用されるため、このスコープ内で定義した関数や変数は、このスコープの外側から干渉したり、直接アクセスすることはできません。ブラウザで

、グローバルオブジェクトは、windowオブジェクトですが、グローバルオブジェクトがwindowではないかもしれません(サーバー上のなしのNode.jsのような)他のJavaScript環境で動作する可能性のあるコードを持っていることを意図している場合、このデフォルトのthisの値からグローバル値を抽出し、それを別の変数に格納して、コードブロック内のどこにでも参照できる方法です。

ブラウザでのみ実行するコードの意味では、実際にはこれには意味がありません。グローバルオブジェクトが必要な場合は、windowを参照することができます。

+0

ブラウザでのみ実行している場合でも、ポイントが存在する可能性があります。 'global'パラメータはおそらく1文字になるので、いくつかのバイトを節約することができます。 'window'を参照するたびに5バイトを節約します。 – josh3736

+0

@ josh3736 - あなたは縮小について正しいと思います。私は一般に、上記の縮小の前に自分のコードを見たことのない人に読みやすさを優先させるので、純粋に縮小のためにこのようなことはしません。しかし、それは個人的な選択です。 – jfriend00

+0

ブラウザ専用の場合は、 'global'ではなく' window'パラメータに名前を付けるだけです。そうすることで、細分化の利点が得られますが、読みやすさを保ちます。あなたは 'window.location'などを書くことができます。実際、jQuery(http://code.jquery.com/jquery-1.7.2.js) - '(function(window、undefined){...})(window);' – josh3736

2

単なる関数のパラメータ名です。 froozbogglesでもかまいません。

このコード:

(function(foo) { 
    // In here, what's called "bar" in the outer scope is called "foo" 
})(bar); 

、1つのパラメータbarを取って匿名関数を定義し、すぐに最初のパラメータとしてbarの値でそれを呼び出します。

jfriend00が彼のすばらしい答えに言及しているのとは別に、それは変数と関数を外側のスコープに漏らさないようにする良い方法です。例えば、var baz = 17;をjavascriptのトップスコープに宣言すると、それはwindowのプロパティになります。あなたが言及したパターンのように関数にラップすると、プロパティをwindowに明示的にエクスポートすることができます - 例の場合は、globalにプロパティを割り当てます。 編集: @ josh3736は彼のコメントで、前の宣言なしで代入することによってwindowにリークすることもできます。 quux = 4711;

+0

+1はユニークな単語を構成します。凍てつく声のためのゼロGoogleのヒット。 –

+0

長いです。 ;-) –

+0

* "ウィンドウにプロパティを明示的にエクスポートすることはできます" * - これは正確ではありません。スコープ内に 'baz'がなければ、普通の' baz = ...; 'はグローバルオブジェクト(' window')に割り当てます。言い換えれば、 '(関数(グローバル){baz = '';})(this)'は明示的に 'window'に割り当てられていなくても' baz'をリークします。 – josh3736

関連する問題