Javascript对象相互交叉引用

时间:2017-03-23 12:32:46

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

我正在尝试为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中产生问题?我是否会陷入某种循环的呼唤并打破宇宙? 这是一个丑陋的模式,应该避免吗?

2 个答案:

答案 0 :(得分:2)

模式没有任何问题。

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

你不应该担心这些东西。垃圾收集器的整个想法就是把这个责任从你身上移开。

答案 1 :(得分:1)

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