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

时间:2012-07-27 18:24:15

标签: javascript jquery stack mode

我有一个基于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');
  ...
}

1 个答案:

答案 0 :(得分:1)

  

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

  • 使用功能属性,例如Catalog.Callback.context
  • 使用monad