Javascript IIFE,不明白这个变量是如何变成全局变量的
Javascript IIFE, don't understand how this variable becomes global
采用以下代码块。没有 return 语句,但 MyApp.VideoTracker 是 window 对象上的 属性,因此可以全局访问。
(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 || {}
如果有解释就好了,我知道这一定是原因,但不明白为什么?
是的,本质上你是用全局变量调用 IIFE。
假设您已经定义了 MyApp
- 并且在执行函数体之前 - 您正在使用一个表达式调用它,该表达式设置 VideoTracker
属性 或 MyApp
与现有的 MyApp.VideoTracker
或空对象文字,并且该引用正在传递到您的 IIFE。
希望对您有所帮助。
那是因为您的 MyApp 已经是一个全局对象 - 由于您的自调用函数,它不会成为一个对象。
- 您认为您还可以通过什么方式访问它的 VideoTracker 属性 或在它不存在时定义它?
- 在 MyApp 对象不作为执行 IIFE 的更高上下文的一部分存在的情况下,它应该上升 引用错误! 因为 MyApp 对象 既未定义,也未在给定的 IIFE 上下文中创建。
采用以下代码块。没有 return 语句,但 MyApp.VideoTracker 是 window 对象上的 属性,因此可以全局访问。
(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 || {}
如果有解释就好了,我知道这一定是原因,但不明白为什么?
是的,本质上你是用全局变量调用 IIFE。
假设您已经定义了 MyApp
- 并且在执行函数体之前 - 您正在使用一个表达式调用它,该表达式设置 VideoTracker
属性 或 MyApp
与现有的 MyApp.VideoTracker
或空对象文字,并且该引用正在传递到您的 IIFE。
希望对您有所帮助。
那是因为您的 MyApp 已经是一个全局对象 - 由于您的自调用函数,它不会成为一个对象。
- 您认为您还可以通过什么方式访问它的 VideoTracker 属性 或在它不存在时定义它?
- 在 MyApp 对象不作为执行 IIFE 的更高上下文的一部分存在的情况下,它应该上升 引用错误! 因为 MyApp 对象 既未定义,也未在给定的 IIFE 上下文中创建。