为什么Backbone模型构造函数中有一个额外的变量?

时间:2014-10-14 22:49:42

标签: javascript backbone.js

  var Model = Backbone.Model = function(attributes, options) {
    var attrs = attributes || {};
    options || (options = {});
    this.cid = _.uniqueId('c');
    this.attributes = {};
    if (options.collection) this.collection = options.collection;
    if (options.parse) attrs = this.parse(attrs, options) || {};
    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments);
  };

不需要

    var attrs = attributes || {};

因为属性不在任何其他地方使用。它可以像选项一样对待。只需将构造函数参数更改为attrs并删除arguments

  var Model = Backbone.Model = function(attrs, options) {
    attrs  || (attrs  = {});

请注意,有三个属性,如变量。传入的参数attributes,实例变量this.attributes以及本地和可能的额外局部变量attrs

2 个答案:

答案 0 :(得分:1)

你所宣称的并不完全正确。 attributes哈希被复制到attrs,后来就地进行了修改;但是,初始参数attributes未经掺杂地传递给initialize.apply

您还可以编写this.initialize.call(this, attributes, options)以使其更加明确。

attrsattributes的可变副本。 options只能被阅读,而不是写入,因此不需要复制。


* JavaScript中的所有内容都是可变的,但此代码的行为就好像参数是不可变的一样。

答案 1 :(得分:0)

通常,代码将包含并非严格必要的变量,但对于提高可读性或减少混淆非常有用。在这种情况下,可能会将本地范围的变量与模型的this.attributes属性区分开来。