将函数传递给Backbone.View.extend

时间:2011-12-14 08:52:02

标签: javascript coding-style backbone.js conventions

最近我和一些同事讨论过我的问题 找不正确。 我们在大型应用程序中使用Backbone,我的创建视图的方式是 '标准'骨干方式:

var MyView = Backbone.View.extend({ 
  className: 'foo', 
  initialize: function() { 
    _.bindAll(this, 'render' /* ... more stuff */); 
  }, 
  render: function() { 
    /* ... render, usually 
      using _.template and passing 
      in this.model.toJSON()... */ 
    return this; 
  } 
}); 

但团队成员最近决定这样做:

var MyView = Backbone.View.extend( (function() { 
  /* 'private stuff' */ 
  function bindMethods(view) { 
    _.bindAll(view, /* ... more stuff */); 
  }; 
  function render(view) { 
     /* ... render, usually 
        using _.template and passing 
        in view.model.toJSON()... */ 
  }; 
  return { 
    className: 'foo', 
    initialize: function() { 
      bindMethods(this); 
      render(this);   
    } 
  }; 
}()); 

这就是伪代码中的想法。 阅读了BB源并阅读了教程,文章我发现这是一个 糟糕的做法(对我来说没有任何意义),但我喜欢一些反馈 其他Backbone开发人员/用户

提前致谢

2 个答案:

答案 0 :(得分:2)

我从使用闭包中看到的一个好处是为您不希望从视图外部的代码访问的变量和函数提供私有作用域。

即便如此,我还没有看到很多Backbone应用程序使用闭包来定义视图/模型/集合等。

以下是来自Jeremy Ashkenas的关于此问题的电子邮件。

  

是的,在JavaScript中可以使用闭包来创建具有私有变量的对象实例。但这是一种不好的做法,应该避免。这与Backbone无关;这是JavaScript中OOP的本质。

     

如果使用闭包模式(也称为“模块”模式),则为每个创建的实例创建每个函数的新副本。这完全忽略了原型,并且在速度方面,特别是在内存使用方面,效率非常低。如果您制作10,000个模型,您还将拥有10,000个每个成员函数的副本。使用原型(使用Backbone.Model.extend),每个成员函数只有一个副本,即使该类有10,000个实例。

答案 1 :(得分:0)

我在这里完全赞同保罗。有时您可能会发现有必要定义私有的方法和属性,而不能从外部搞砸。我认为这取决于您是否需要在课堂上使用这种范围机制。根据你对课程的要求,混合两种方法都不会那么糟糕,不是吗?