【问题标题】:Push Function(s) with args into an Array to call up later将带有 args 的函数推送到数组中以便稍后调用
【发布时间】:2014-08-31 01:21:24
【问题描述】:

我有一个add 方法将function 推入array,以便稍后调用。

class FRAME.Renderer
  camera   : FRAME.__Camera
  renderer : FRAME.__Renderer 
  scene    : FRAME.__Scene 


  constructor : ( lookAt )->
    @lookAt  = lookAt or false
    @modules = []


  add : ( module )->
    self = this 

    if typeof( module ) is 'function' then @modules.push( module )
    else throw new Error( 'add() only accepts a Function' )

    this 

  build :->
    self = this 
    len  = @modules.length  

    setup =( i )->
        temp = self.modules[i].bind( self )
        temp()

    if len isnt 0 then for i in [0..len-1] then setup( i )


makeCircle =->
  # Circle stuff

makeSquare =->
  # Square stuff

renderer = new FRAME.Renderer()
renderer.add( makeCircle )
renderer.add( makeSquare )

renderer.render()

这没有任何问题。如何或有可能进行此设置并使用具有参数的函数调用add(我应该使用object/array combo [{}] 来代替modules)吗?

makeSquare = ( options )->
  # Square stuff

renderer.add( makeSquare, options )

【问题讨论】:

  • 有可能,是的,但你为什么不直接使用闭包呢?
  • modules : [] 需要进入构造函数,否则it would be shared amongst all instances!!!
  • @Bergi - 完全错过了谢谢!
  • 使用闭包是个好主意——我什至没有想到。
  • @Bergi 谢谢!我在想象更复杂的事情,却完全忽略了摆在我面前的简单解决方案。

标签: javascript coffeescript


【解决方案1】:

是的,这是可能的,而且使用 coffeescript 实际上很容易:

add: (module, args...) ->
  if typeof module is 'function'
    @modules.push {fn: module, args: args}
  else
    throw new Error 'add() only accepts a Function'
  @
build: ->
  for {fn, args} in @modules
    fn(args...) # or
    fn.apply @, args # if you want to bind them
  @

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 2020-04-06
    • 2019-12-16
    • 1970-01-01
    • 2023-03-26
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多