(function()
{
//codehere
}
)();
この種の構文の特別な点は何ですか? ()(); とは何ですか? 意味する?
(function()
{
//codehere
}
)();
この種の構文の特別な点は何ですか? ()(); とは何ですか? 意味する?
は匿名関数、クロージャー、およびすべてを作成し、最後の () はそれ自体を実行するように指示します。
基本的には次と同じです。
function name (){...}
name();
したがって、基本的にこのコードには特別なことは何もありません。メソッドを作成し、名前を付けずに呼び出すための「ショートカット」にすぎません。
これはまた、関数が 1 回限りの、またはオブジェクトの内部関数であることを意味し、クロージャの機能が必要な場合に最も役立ちます。
呼び出されるのは無名関数です。
その目的は、ローカル変数が流出しない新しいスコープを作成することです。例えば:
var test = 1;
(function() {
var test = 2;
})();
test == 1 // true
この構文に関する重要な注意事項の 1 つは、ステートメントをセミコロンで終了する習慣を身に付ける必要があることです (まだ行っていない場合)。これは、Javascript を呼び出すときに、関数名とその括弧の間で改行が許可されているためです。
以下のスニペットでは、エラーが発生します。
var aVariable = 1
var myVariable = aVariable
(function() {/*...*/})()
実際に行っていることは次のとおりです。
var aVariable = 1;
var myVariable = aVariable(function() {/*...*/})
myVariable();
新しいブロック スコープを作成する別の方法は、次の構文を使用することです。
new function() {/*...*/}
違いは、前者の手法はキーワード「this」が指す場所に影響しないのに対し、2 番目の手法は影響することです。
Javascript 1.8 には、同じことを行う let ステートメントもありますが、言うまでもなく、ほとんどのブラウザーではサポートされていません。
これは、自己実行型の無名関数です。最後の () は実際に関数を呼び出しています。
Javascript でのこれらのタイプの構文の使用法を説明している良い本 (私が読んだことがあります) は、Object Oriented Javascriptです。
この使用法は、基本的に C の内部ブロックと同等です。これにより、ブロック内で定義された変数が外部に表示されなくなります。そのため、プライベート オブジェクトを使用して 1 回限りのクラスを構築する便利な方法です。return this;
オブジェクトの作成に使用する場合は忘れないでください。
var Myobject=(function(){
var privatevalue=0;
function privatefunction()
{
}
this.publicvalue=1;
this.publicfunction=function()
{
privatevalue=1; //no worries about the execution context
}
return this;})(); //I tend to forget returning the instance
//if I don't write like this
O'Reilly から入手できる Douglas Crockford の優れた「JavaScript: The Good Parts」も参照してください。
http://oreilly.com/catalog/9780596517748/
...そして YUIblog のビデオはこちら:
http://yuiblog.com/blog/2007/06/08/video-crockford-goodstuff/
括弧の最初のセット内のものは、関数に評価されます。次に、2 番目の括弧のセットがこの関数を実行します。したがって、onload で自動的に実行したいものがある場合は、この方法でロードして実行します。