【问题标题】:Javascript Objects cross referencing each otherJavascript 对象相互交叉引用
【发布时间】:2017-08-16 00:20:54
【问题描述】:

我正在尝试为router5 开发一个插件。

router5 插件是一个函数,它接收一个路由器实例并返回一个带有名称和一些方法的对象。

您可以在下面找到代码的相关部分:

function myPluginFactory(store) {
  // So that store can be in the closure
  function myPlugin(router){

    // The router will reference the store
    router.setDependency({'store': store});

    // The store will reference the router
    store.setRouter(router);

    // Public APi
    return {
      onTransitionStart(fromState, toState){
        router.onTransitionStart(fromState, toState);
      }
      // ...
    }
  }

  myPlugin.pluginName = "MY_PLUGIN";
  return myPlugin;
}

class RouterStore {
  router = null;

  setRouter(router) {
    this.router = router;
  }
}


// **************** //

import routes from './routes';
import createRouter from 'router5';

const myRouterStore = new RouterStore();
const router = createRouter(routes, {});

// The .usePlugin will call the function returned by 
// myPluginFactory(myRouterStore) and call it passing the router instance
router.usePlugin(myPluginFactory(myRouterStore)); 

所以首先我实例化我的路由器,然后我调用方法 usePlugin 来创建我的插件并将其传递给路由器。

我的问题来自 myPlugin 函数的前 2 条指令。
那就是:

  • 我创建了从路由器对象到存储对象的引用
  • 创建从存储对象到路由器对象的引用

这会创建一个交叉引用。

问题:
这种交叉引用会在 javascript 中产生问题吗?我可以陷入某种循环呼叫并打破宇宙吗?
这是一个丑陋的模式,应该避免吗?

【问题讨论】:

    标签: javascript ecmascript-6 pass-by-reference javascript-objects factory


    【解决方案1】:

    模式没有错。

    垃圾收集器偶尔会跟踪每个引用,从根(全局范围)开始。这意味着无法访问的循环引用将被垃圾回收。

    你不应该担心这些东西。垃圾收集器的整个想法就是让您摆脱这种责任。

    【讨论】:

      【解决方案2】:

      使用这种模式就可以了。交叉引用用于在 js 中实现树和图,它很常见。 但这可能会导致内存泄漏,因为 js 对象只有在没有对它们的引用时才会被垃圾收集。 (在你的例子中不太可能) Altho 在嵌套迭代中按属性 ti 冷创建一个无限循环。

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        • 2015-04-06
        相关资源
        最近更新 更多