【发布时间】: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