Javascript IIFE,不明白这个变量如何变成全局变量

时间:2016-11-28 10:35:59

标签: javascript iife

采取以下代码块。没有return语句,但MyApp.VideoTracker是窗口对象上的属性,因此可以全局访问。

 (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 || {}

解释会很棒,因为我可以看出这一定是原因,但不明白为什么?

2 个答案:

答案 0 :(得分:2)

是的,基本上你用全局变量调用IIFE。

假设您已经定义了MyApp - 并且在执行函数体之前 - 您使用一个表达式调用它,该表达式将VideoTracker属性设置为MyApp MyApp.VideoTracker或空对象文字,并且该引用正在传递到您的IIFE。

希望有所帮助。

答案 1 :(得分:0)

那是因为您的 MyApp 已经是一个全局对象 - 由于您的自我调用功能,它不会成为一个对象。

  • 您认为如果不存在 VideoTracker 属性或定义它还有什么其他内容?
  • 如果 MyApp 对象不是作为执行IIFE的更高上下文的一部分存在的情况,则应该引发参考错误!因为 MyApp对象既未定义,也未在给定的IIFE上下文中创建。