JS IIFE 破坏 YouTube 跟踪

JS IIFE breaks YouTube Tracking

我很困惑为什么将我的 YouTube 跟踪代码放入 IIFE 后它会停止工作。

我的理解是 IIFE 运行 是即时的,那么为什么只包含纯 js 的脚本与包含 IFEE 的脚本之间存在差异?

这是我的纯 JS,可以正常工作:

if ( 0 < ga_options.youtube.length ) {
    var tag = document.createElement( 'script' );
    tag.src = '//www.youtube.com/iframe_api';
    var firstScriptTag = document.getElementsByTagName( 'script' )[0];
    firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );

    function onYouTubeIframeAPIReady() {
        scroll_events.register_youtube_videos();
    }
}

但是,当我将它包装在 IIFE 中时,如下所示,它不再有效(没有触发跟踪事件)。我正在尝试使用 IIFE 作为将现有代码重组为独立单元的一部分。

有人能解释一下我做错了什么吗?我已经考虑过范围并尝试在 IIFE 之外使用 var tagvar firstScriptTag,但仍然没有成功。

gaEventsVideoTracking = (function(){

    window.console.log( "why no youtube tracking?" );
        if ( 0 < ga_options.youtube.length ) {
            tag = document.createElement( 'script' );
            tag.src = '//www.youtube.com/iframe_api';
            firstScriptTag = document.getElementsByTagName( 'script' )[0];
            firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );

            function onYouTubeIframeAPIReady() {
                scroll_events.register_youtube_videos();
            }
        }
})();

函数 onYouTubeIframeAPIReady 由从 YouTube 服务器加载的脚本调用。

由于您使用函数声明来定义它,因此它局部 作用域为 IIFE。这意味着它不是全局的,因此无法供 YouTube 脚本调用。

您可以明确地使其成为全局的。

在第一行添加var onYouTubeIframeAPIReady; IIFE之外),然后将onYouTubeIframeAPIReady =放在函数声明的前面,使其成为函数表达式和将其分配给全局变量。