関数をラップする()
は、匿名関数宣言を関数式に変換します。関数式は、式の後に続く()
ですぐに呼び出すことができます。
この場合、var foo =
はそれを式に変換するので、外側の()
は実際には必要ありません。また、foo
の値は、undefined
になります。これは、関数呼び出しが何も返さないためです。
新しい変数スコープを作成するために使用することができます。これは、関数がjavascriptでこれを実現する唯一の方法であるためです。 (JavaScriptにはブロックスコープはありません)
したがって、someVar
変数は外部スコープからアクセスできません。制御された方法でアクセス可能にすることが望ましい場合があります。これを行うには、someVar
を参照するスコープから関数を渡すことができます。関数の呼び出しが終了すると、その実行コンテキストはそのまま残り、渡された関数が提供する方法であれば、someVar
が利用可能になります。
これはclosure
の作成と呼ばれます。
呼び出しに値を渡して、それをsomeVar
に割り当てたとします。 foo
変数への呼び出しから関数return
を呼び出すことができます。その関数が参照someVar
を返した場合、その関数を使用して値を取得できます。
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function() {
alert(someVar);
};
})('somevalue');
foo(); // alerts 'somevalue'
あなたが見ることができるように、今foo
で参照される関数は、まだsomeVar
にアクセスすることができます。
foo
に返された関数が引数を受け入れるように変更したとします。この引数は、myVar
の値を更新します。
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function(n) {
if(n) {
someVar = n;
} else {
alert(someVar);
}
};
})('somevalue');
foo(); // alerts 'somevalue'
foo('newvalue'); // give it a new value
foo(); // alerts 'newvalue'
今、あなたはその値を変更し、それが以前に設定した新しい値を参照することができますようfoo
内の関数は本当に、その変数にアクセスしないこと、見ることができます。
http://stackoverflow.com/questions/4531110/jquerys-function-jquery-syntax/4531124#4531124 –
これは正確な複製ではありません。具体的なjQueryのケースではなく、より一般的なケースです。それはこれの類推である。 – Orbling
@Orblingええ、両方の質問の回答はjquery固有のものではありません。 –