JS中运行时上下文模式的最佳实践

Best practise for context mode at runtime in JS

本文关键字:最佳 模式 运行时 上下文 JS      更新时间:2024-05-03

我有一个基于apache的web应用程序。php、js和jquery。一切都很好。

在客户端,JS/jquery中有一个小库,提供一些通用的列表处理方法。在过去,我使用回调来处理那些方法行为略有不同的少数问题。这样,我就可以为应用程序的不同部分重用列表处理、对话框处理等方法。然而,最近,当我进入图书馆时,我不得不进行的回调数量增加了,我正在尝试重新设计:

我没有将所有回调指定为函数参数,而是在库中创建了一个中心目录对象。应用程序的每个模块在初始化时都会将自己的回调变体注册到该目录中。在运行时,方法在该目录中查找所需的回调,而不是期望在其参数列表中指定它。这会把事情清理得很干净。

然而,有一件事我仍然无法摆脱:我需要一个参数(我称之为上下文,模式可能是另一个术语),该参数由方法用来在目录中查找所需的回调。必须将此上下文传递给所有方法。当然比到处指定的各种不同的回调要好,但我想知道我是否可以去掉最后一个回调。但是,如果不是作为方法参数,我在哪里指定上下文呢?我对JS和jquery还很陌生,所以我没能找到一种方法。显然,我不想使用全局变量,坦率地说,我怀疑我是否可以简单地将上下文存储在单个变量中,因为由于所有的事件处理程序和外部影响,方法可能会在不同的上下文中同时调用,或者至少是交错调用。所以我想我需要一些更接近函数堆栈的东西。也许我可以简单地将上下文对象推送到堆栈中,并从需要知道的库层中读取它?当我再次离开库时,该对象将被删除。当然,也存在其他方法。

这里有很多经验丰富的程序员,他们当然可以给新手一个简短的提示,一个产生想法的起点,以及如何实现这一点。这种事通常是怎么做的?


我试了一段时间,探索arguments.callee.caller层次结构。我想也许我可以在调用函数中设置一个原型成员,然后,当执行步骤进一步下降时,我可以简单地向上遍历调用堆栈,直到我找到一个拥有这样属性的调用方,并将该值用作上下文。然而,我也看到了正在进行的讨论,其中揭示了两件事:1.)arguments.callee似乎贬值了,2.)它似乎真的很贵。所以这是不可能的。

我还读到了Function.caller的替代方案(它看起来而不是贬值,效率更高,但直到现在我都没能探索到这条线索…


正如目前所写的那样,传递上下文/模式只需在函数调用中指定一个额外的参数即可。它携带一个唯一的字符串,该字符串在查阅目录时用作关键字。所以像这样的东西(不是复制的,而是作为原始示例编写的):

<!-- callbacks -->
callback_inner_task_base:function(arg1,arg2){
  // do something with args
}
callback_inner_task_spec:function(arg1,arg2){
  // do something with args
}
<!-- catalog -->
Catalog.Callback:function(context,slot){
  // some plausibility checks...
  return Catalog[context][slot];
}
Catalog.base.slot=callback_inner_task_base;
Catalog.spec.slot=callback_inner_task_spec;
<!-- callee -->
do_something:function(arg1,arg2,context){
  ...
  // callback as taken from the catalog
  Catalog.Callback(callback,'inner_task')(arg1,arg2);
  ...
}
<!-- caller -->
init:function(...){
  ...
  do_something('thing-1',thing-2','base');
  do_something('thing-1',thing-2','spec');
  ...
}

但是,如果不是作为方法参数,我在哪里指定上下文呢?

  • 使用函数属性,例如Catalog.Callback.context
  • 使用monad