2016-11-28 2 views
1

次のコードブロックを実行してください。 returnステートメントはありませんが、MyApp.VideoTrackerはウィンドウオブジェクトのプロパティなので、グローバルにアクセスできます。Javascript IIFE、この変数がどのようにグローバルになるかわからない

(function(window, $, VideoTracker, undefined) { 
    "use strict"; 

    VideoTracker.loadAPI = function(apiReadyCallbackFn) { 
    }; 

    VideoTracker.destroy = function(iframeElement) { 
    }; 

    VideoTracker.trackVideos = function() { 
    }; 

    $().ready(function() { 
     var youTubeIframes = $('iframe[src*="youtube.com"]'); 
     if (youTubeIframes.length > 0) { 
      VideoTracker.loadAPI(VideoTracker.trackVideos); 
     } 
    }); 

}(window, jQuery, MyApp.VideoTracker = MyApp.VideoTracker || {})); 

なぜならそれは関数呼び出しで定義されている方法、すなわちのこのです:

MyApp.VideoTracker = MyApp.VideoTracker || {} 

私はこれが理由である必要があります見ることができますが、理解していないような説明は、素晴らしいことですどうして?

+0

はい、本当に割り当てです。 MyApp.VideoTrackerを渡すだけ|| {}。しかしMyAppがどこから来ているかは疑問です。 – Lain

+4

が動作するためには、 'MyApp'が既にウィンドウオブジェクトになければなりません。つまり、' MyApp'コードのその時点で=== 'window.MyApp' ...' MyApp'がオンでなかった場合ウィンドウオブジェクトで、コードが実行されず、 'ReferenceError:MyApp is defined'エラーが発生します。 –

+0

Cool MyAppは既にウィンドウのプロパティです。私はあなたが関数呼び出しで代入することができないと気づいた – DavidB

答えて

2

はい、本質的には、グローバル変数であるIIFEを呼び出しています。関数本体が実行される前に - - あなたは、既存のMyApp.VideoTrackerまたはリテラル空のオブジェクトでMyAppVideoTrackerプロパティを設定し、その参照があるいずれかのことを表現して、それを呼び出しているあなたはすでにMyAppを定義したと仮定すると、

あなたのIIFEに渡されます。

希望に役立ちます。それは一つになっていませんalready-ので、あなたの自己呼び出される関数の、グローバルオブジェクトであるあなたMyAppのためだ

0

  • 他にどのようにあなたがそのVideoTrackerプロパティにアクセスしたり、それはそこにない場合は、それを定義することができるだろうと思いますか?
  • MyAppオブジェクトが、IIFEが実行されている上位コンテキストの一部として存在しない場合は、参照エラーが発生するはずです。MyAppオブジェクトが定義されておらず、指定されたIIFEコンテキスト内で作成されていないためです。
関連する問題