【问题标题】:JavaScript and ES6, "global" variablesJavaScript 和 ES6,“全局”变量
【发布时间】:2016-02-25 19:29:10
【问题描述】:

3 年来,我一直在使用 JavaScript 的小 sn-ps,但现在我正在构建一个 React 应用程序,并且我正在涉足它。有一个基本的东西我不明白。 React 使用 Dispatcher 和 Stores 来构建它的 Flux 模式,我没有得到的是这个 Dispatcher 在所有应用程序中都是可见的,因为 Actions 使用 dispatcher 来调度操作,而 Stores 注册到 Dispatcher 以获得通知(所以它不是每次都是新的调度程序)。那么,我怎样才能实现这个“全局”范围或任何它被称为的范围?如何使用 ES6 类(模块)来实现这一点?

由于我缺乏真正的 JavaScript 编程经验,这个问题可能不清楚,我希望在社区 cmets 的帮助下我能够安排。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    无论您身在何处,您都可以始终将变量分配给window.MyClass = whatever(nodejs 为global.MyClass),并从应用程序中的任何其他文件访问这些值。不过,这并不总是在您的应用程序中全局共享数据的最佳方式。 nodejs 中的模块加载器(或 ES6 中的 AMD)获取您导出的任何内容并缓存它。假设您有一个类似的文件:

    MyModule.js:

    class MyClass {
      constructor() {
        this.someData = 55;
      }
    }
    
    export default (new MyClass);
    

    现在,每当我们从其他地方需要此文件时,我们总是会得到相同的 MyClass 实例。这意味着:

    file1.js:

    import MyClass from './MyModule'
    MyClass.someData = 100;
    

    file2.js:

    import MyClass from './MyModule'
    console.log(MyClass.someData);
    

    这称为单例模式,我们在整个应用程序中传递您的类的一个常见实例。因此,通过这种方式,我们能够从不同的文件中访问 MyClass 的同一个实例,而不会污染全局范围(我们避免对 global.MyClass 进行分配,但完成了相同的功能)。

    【讨论】:

    • 完美,我将我的课程导出为export default MyClassName
    • @vicaba 了解更多上下文,我在上面表达的模式称为单例模式 ^,您可以在其中传递项目中类的一个常见实例
    • 访问窗口对象参数很慢。不要这样做...哦,我刚读完第一行就立即开始写作。实例返回的解决方案很好,对我有用。
    • 依赖模块缓存实现单例的解决方案并不总是好的。如果您使用 HMR,它将无法正常工作。
    • 因为你不是返回类而是它的一个实例。我认为您应该使用import MyClassimport myClass 等小写首字母
    【解决方案2】:

    您正在寻找的是创建一个单例。来自http://amanvirk.me/singleton-classes-in-es6/

    let instance = null;
    export default class Cache{
      constructor() {
        if (!instance) { instance = this; }
        this.time = new Date()
    
        return instance;
      }
    }

    我对此进行了测试,它可以工作。您只需将 this.time = new Date() 替换为 this.singletonFunction = function(){}。然后在你想使用它的地方进行导入

    let aSingleton = (new importName()).singletonFunction;

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2022-01-01
    相关资源
    最近更新 更多