【问题标题】:Call IIFE From Another Javascript File从另一个 Javascript 文件调用 IIFE
【发布时间】:2016-01-07 14:21:26
【问题描述】:

我有一个文件bg.js,其内容只是一个 IIFE。我想加载这个文件/从另一个文件中的另一个函数调用该函数。由于 IIFE 是匿名的(它是,对吗?)我不能直呼其名。看来我必须加载整个文件才能立即执行。

我已经搜索并找到了许多关于什么是 IIFE 的教程和文档,但我没有看到如何从另一个范围执行一个。

如何从另一个 javascript 文件调用/加载作为 IIFE 的 javascript 文件?

更多信息 IIFE 加载在我页面的页脚中。当我单击链接进行导航时,不会执行页眉和页脚脚本。页脚中的 IIFE 负责设置背景图片,所以我需要在我的perPageBindings() 中执行该函数。

我认为我需要做的是从主体中的另一个函数调用 IIFE,该函数在 perPageBindings() 中执行

为清晰起见进行编辑 我正在考虑两种选择:

  1. 只需将脚本标签从页​​脚移至正文即可;或
  2. 为 IIFE 命名,使其不再是匿名的,然后从其他地方调用该命名函数

如果 2 是一个可行的选项,那么我想我会提出一个关于将 IIFE 转换为命名函数的新问题。

【问题讨论】:

  • 可以使用$.getScript全局加载js文件并执行。
  • 根据定义,立即调用 IIFE - 能够“从另一个文件调用它”是没有意义的。
  • 这听起来像是 XY 问题。需要更多关于 IIFE 的功能以及您希望它做什么以及按什么顺序执行的详细信息
  • 我认为,如果您包含一些代码和您的实际意图,您可能会发现您得到的答案可以为您提供更好的方法/替代方案
  • 重组 IIFE,使其成为您可以在需要时调用的函数

标签: javascript jquery iife


【解决方案1】:

如果您想访问该脚本、函数或属性中的某些内容,则在匿名调用之后,您需要将该函数的一些内部暴露给可从全局范围访问的某些内容。

我并不是说您必须让您的函数将变量放入全局范围,尽管这是许多库所做的并且是 UMD 遵循的路径之一,如果 CommonJSAMD 环境是不可用。

您应该查看Revealing Module Pattern 以获得更好的视角。

考虑以下代码sn-p:

(function(global){
    /*
     * This variable will stay "private" 
     * because it is scoped to the IIF
     */
    var someProp = "Hello World";

    /*
     * This property is effectively exposed 
     * because it is accessible through 
     * myLib.foxtrot below
     */
    var someOtherProp = "Hello to you too";

    var myLib = {
        foo: "bar",
        fiz: true,
        buzz: 1,
        foxtrot: someOtherProp
    };

    /*
     * myLib is now accessible through the 
     * global that we passed to the IIF below
     * at the point of calling with "window"
     */
    global.myLib = myLib;

}(window));

【讨论】:

    【解决方案2】:

    似乎您想在某个使其可重用的地方定义此函数。如果要从页脚调用,请将可重用函数调用包装在 IIFE 中。这样它会立即在页脚中调用并调用您的函数,但您也可以在其他地方调用此函数。

    例子:

    JS:

    function setBackground () {
        // sets background and can be called whenever
    }
    

    HTML:

    <footer>
        <script>
            (function () {
                setBackground();
            } ());
        <script>
    </footer>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 2019-01-16
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多