2012-07-27 46 views
0

我有一个基于apache的web应用程序。 PHP,JS和jQuery。一切正常。JS中运行时上下文模式的最佳实践

在客户端,JS/jquery中有一个小型库,提供了一些通用的列表处理方法。在过去,我使用回调来处理这些方法必须略有不同的几个问题。这样我可以重复使用列表处理,对话框处理和应用程序的不同部分的东西。然而,最近我进入图书馆时不得不通过的回调数量越来越多,我正在尝试重新设计:

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

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

在这里有如此多的有经验的编程人员可以给一个新手提供一个简短的提示,这是一个可以产生想法的起点,以及如何实现它。这种“通常”是如何完成的?


我试了一会,探索arguments.callee.caller层次结构。我想也许我可以在一个调用函数中设置一个原型成员,然后,当执行进一步下去时,我可以简单地向上遍历调用堆栈,直到找到一个调用者持有这样的属性并将该值用作上下文。 但是我也看到了正在进行的讨论,它揭示了两件事:1.)arguments.callee似乎被折旧,并且2.)它看起来非常昂贵。所以这是不行的。

我也看了一下Function.caller替代(这似乎被贬值,更有效,但是到现在为止我没有探索踪迹......


目前书面传递context/mode down只是简单的在函数调用中指定一个附加参数,它带有一个唯一的字符串,在查询目录的时候用作关键字,所以像这样(不能复制,但是写成原始的例子):

<!-- 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

你有代码的一个小例子吗? – elmuchacho 2012-07-27 22:22:05

+0

@elmuchacho嗯,这并不容易。这个东西是开源的,但是简单地给你代码库的URL将无济于事,代码遍布在太多的文件中。我不明白我能如何轻松地过滤出一个小而有意义的例子......这就是为什么我试图以更为描述的方式提出问题,试图将事物放在一个普通的形状中。有没有什么特别的细节你想看看? – arkascha 2012-07-28 04:35:01

+0

@arkascha然后显示一个例子,说明在一个简单情况下这个上下文是如何传递的? – 2012-07-28 09:26:28

回答

1

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

  • 使用的功能特性,如Catalog.Callback.context
  • 使用monad