IIIFFEは直ちに関数を実行します.

3486 ワード

以下のようなコードです.
(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 (          )
締め括りをつける
  • 関数式に変換できる操作は、IIIFE
  • を構成することができます.
  • IIIIIIIFEは、一般関数と同様に、参照できます.戻り値
  • があります.
  • IIIIFは、モジュール化
  • のための局所変数を作成することができる.
    参照
  • .javascriptを即座に実行する関数式(IIF)