js:如何从外部访问内部定义的类(可访问性问题)

时间:2017-03-30 08:57:15

标签: javascript class requirejs require

这个问题困扰了我一段时间。 我试图从外部调用一个类(可访问性问题),我的代码如上所示。

require(['foo'],
    (foo) => {
        class Bar {
            hello() {
                return "hello";
            }
        }
    });
bar = new Bar();
//uncaught ReferenceError: Chart is not defined

我找到了一个解决方法,这是通过使用window.Bar = class Bar ...

完成的。
require(['foo'],
    (foo) => {
        window.Bar = class Bar {
            hello() {
                return "hello";
            }
        }
    });
bar = new Bar();
//OK

然而,当使用Babel转换它时,这不是一个方便的解决方案。

您是否知道其他更正确的导出/定义此类的方法,以便可以从上层调用它?

提前完成

2 个答案:

答案 0 :(得分:1)

你不会。相反,您将在回调中编写完整的模块代码

require(['foo'], foo => {
    class Bar {
        hello() {
            return "hello";
        }
    }
    const bar = new Bar();
    // ...rest of code here...
});

这是写作需求式模块的正常方式。你不会在脚本的顶层写任何东西,它都在回调中,尤其是要求可以在适当的时候调用它。

答案 1 :(得分:0)

  

导出/定义此类的正确方法

当你想“导出”东西时,你想要做的就是创建一个模块。为此,您使用define来电,而非require。然后,您可以返回要导出的内容。例如:

define(['foo'], (foo) => {
  class Bar {
    hello() {
      return "hello";
    }
  };

  return Bar;
});

如果此代码位于名为bar.js的文件中并且您正确设置了RequireJS配置,以便RequireJS可以找到它,那么您可以从其他地方执行require(["bar"], function (Bar) {...})或其他模块可以使用它:

define(["bar"], function (Bar) {
  const bar = new Bar();
  // do more stuff...
});

requiredefine加载依赖关系并使用已解析的依赖关系执行回调,但只有define实际定义模块。除非您在模块中,否则没有使用RequireJS“导出”的概念,这意味着您使用define