IIIFFEは直ちに関数を実行します.
3486 ワード
以下のようなコードです.
第一の場合:
第二の場合:
第三の場合:
だから、こうも書いてもいいです.
クローズドとのコンビネーション
1.関数内部の変数状態を保存します.
下のコードはあなたが思っているように実行されません.
2.局所変数、モジュール化
即実行関数はモジュール化においても大きな役割を果たします.すぐに関数処理を実行することで、グローバル変数による空間汚染を低減し、より多くのプライベート変数を構築することができます.関数式に変換できる操作は、IIIFE を構成することができます. IIIIIIIFEは、一般関数と同様に、参照できます.戻り値 があります. IIIIFは、モジュール化 のための局所変数を作成することができる.
参照.javascriptを即座に実行する関数式(IIF)
(function foo(){
console.log( "Hello!" );
})();
IIIFE書き方について第一の場合:
function(){ /* code */ }(); // SyntaxError: Unexpected token (
JavaScriptは、解析コードの場合、function
キーワードに遭遇したとき、関数として宣言されることをデフォルトにします.関数式ではなく、関数式を明示的に書いていない場合は、関数名が必要です.上のエラーは関数名がないからです.一番目の左括弧です.第二の場合:
function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
式の後に括弧を入れて行います.さらに、関数でステートメントを宣言し、ステートメントの後ろに括弧を入れると、次のようになります.function foo(){ /* code */ }
(); // SyntaxError: Unexpected token )
関数fooを宣言したのに相当し、()
の表現動作が後に行われる.()
は、パケットオペレータを表しています.内部表現は空ではないので、エラーが発生しました.上のエラーは、パケットオペレータ内が空のエラーです.第三の場合:
(function(){ /* code */ }());
なぜこのようにすぐ実行できます.そしてエラーを報告しないですか?Javascriptでは、括弧の内部に語句が含まれていないため、解析器がコードを解釈すると、()
に先に出会い、その後、functionキーワードに出会うと自動的に関数式ではなく()
の中のコードを関数式として認識します.だから、こうも書いてもいいです.
(function(){ /* code */ })();
また、機能が()
と類似している限り、ステートメントを式に変換する方式はIIIFEに使用でき、例えば以下のような書き方は有効である.false || function () {console.log('hello')}()
true && function () {console.log('hello')}()
'anything', function () {console.log('hello')}()
~function () {console.log('hello')}()
!function () {console.log('hello')}()
+function () {console.log('hello')}()
-function () {console.log('hello')}()
~(function () {console.log('hello')})() //
第四の場合:var i = function(){ return 10; }();
このような書き方は、fucntion
を関数式として用い、()
を追加しなくても良いが、コードの読み取り可能性を高めるために、追加することを提案する.クローズドとのコンビネーション
1.関数内部の変数状態を保存します.
下のコードはあなたが思っているように実行されません.
i
の値はロックされていません.リンクをクリックしたときに、フォームサイクルはすでに実行されました.そこでクリックしたときに、iの値はすでにelems.lengthです.var elems = document.getElementsByTagName( 'a' );
for ( var i = 0; i < elems.length; i++ ) {
elems[ i ].addEventListener( 'click', function(e){
e.preventDefault();
alert( 'I am link #' + i );
}, 'false' );
}
このように書き換えますvar elems = document.getElementsByTagName( 'a' );
for ( var i = 0; i < elems.length; i++ ) {
(function( i ){
// i i , :
elems[ i ].addEventListener( 'click', function(e){
e.preventDefault();
console.log( 'I am link #' + i );
}, 'false' );
})( i );
}
IIFコードのi
と外のi
は、異なる作用領域において、全く異なる2つの値であり、名前だけが同じである.2.局所変数、モジュール化
即実行関数はモジュール化においても大きな役割を果たします.すぐに関数処理を実行することで、グローバル変数による空間汚染を低減し、より多くのプライベート変数を構築することができます.
//
// ,
// , i
// i, counter.i i
//
var counter = (function(){
var i = 0;
return {
get: function(){
return i;
},
set: function( val ){
i = val;
},
increment: function() {
return ++i;
}
};
}());
// counter
counter.get(); // 0
counter.set( 3 );
counter.increment(); // 4
counter.increment(); // 5
counter.i; // undefined i counter
i; // ReferenceError: i is not defined ( )
締め括りをつける参照