Javascript 未捕获引用错误:函数已定义时未定义函数

Javascript 未捕获引用错误:函数已定义时未定义函数,javascript,html,Javascript,Html,我有一个已定义但不在DOM中工作的函数。 我正在处理2个文件。比如说,A.js和B.js 在A.js中,我有一些如下代码 (function() { var initData = { version: "1.0.0", host: "xyz.com", page_id: "someDynamicID", }; function initVarData(initData) { if (!window.ABCD)

我有一个已定义但不在DOM中工作的函数。

我正在处理2个文件。比如说,A.jsB.js

在A.js中,我有一些如下代码

(function() {
    var initData = {
        version: "1.0.0",
        host: "xyz.com",
        page_id: "someDynamicID",
    };
    function initVarData(initData) {
        if (!window.ABCD) {
            window.ABCD = initData;
        }
    }
    initVarData(initData);
})();

(function(d, id) {
    function appendToBody(d, el) {
        if (d.head) {
            d.head.appendChild(el);
        } else {
            setTimeout(appendToBody.bind(null, d, el), 500);
        }
    }
    if (d.getElementById(id)) {
        window.ABCD && ABCD.widgets.parse();
        return;
    }

    var js = d.createElement("script");
    js.id = id;
    js.async = true;
    js.src = "https://myserver.com/js/B.js";
    appendToBody(d, js);
})(document, "test");
A.js中,我定义了一些动态数据(这个A.js脚本实际上是从后端加载的)。然后A.js调用B.js加载到DOM中

B.js中,我有如下代码

(function(window, document) {
  window.bng = function(buttonID) {
    var button = document.getElementById(buttonID);

    if (button) {
      button.addEventListener(
        "click",
        function() {
          alert("This alert is from B.js");
        },
        false
      );
    }
  };
})(window, document);
此函数在控制台中更新,但在DOM中不更新

在html中,我调用了A.js并使用bng(“buttonId”)。但是我得到了错误uncaughtreferenceerror:bng没有定义

我已经用计算机解决了这个问题

window.addEventListener('load', function() {
  bng("buttonId");
});

但是我想不使用onLoad函数。Facebook在他们的SDK中使用了类似fbq的功能。

我认为,如果您让scriptB.js先加载(阻止脚本),问题应该得到解决

注释掉A.js中尝试加载B.js的行

  // var js = d.createElement("script");
  // js.id = id;
  // js.async = true;
  // js.src = "https://myserver.com/js/B.js";
  // appendToBody(d, js); 
并按如下所示编辑HTML

<head>
    <title>JS Tests</title>
    <script type="text/javascript" src="src/B.js"></script>
    <script type="text/javascript" src="src/A.js"></script>
</head>

JS测试
您可以尝试下面的代码片段,看看它是否有效


JS测试
点击我
bng(“btn_测试”);

我认为,如果让scriptB.js先加载(阻塞脚本),问题应该得到解决

注释掉A.js中尝试加载B.js的行

  // var js = d.createElement("script");
  // js.id = id;
  // js.async = true;
  // js.src = "https://myserver.com/js/B.js";
  // appendToBody(d, js); 
并按如下所示编辑HTML

<head>
    <title>JS Tests</title>
    <script type="text/javascript" src="src/B.js"></script>
    <script type="text/javascript" src="src/A.js"></script>
</head>

JS测试
您可以尝试下面的代码片段,看看它是否有效


JS测试
点击我
bng(“btn_测试”);