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

Javascript 为什么主干模型构造函数中有一个额外的变量?,javascript,backbone.js,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.co

没有必要这样做

  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);
  };
as属性不在任何其他地方使用。可以将其视为选项。只需将构造函数参数更改为
attrs
,并去掉
参数

    var attrs = attributes || {};

请注意,有3个类似属性的变量。传入的参数
attributes
、实例变量
this.attributes
以及局部变量和可能的额外局部变量
attrs
通常情况下,代码将包含一些变量,这些变量不是严格必需的,但有助于提高可读性或减少混淆。在这种情况下,可能需要将局部作用域变量与模型的
this.attributes
属性区分开来。

您所断言的并不完全正确。
属性
散列被复制到
属性
中,该属性随后被就地修改;但是,初始参数
attributes
会被完全传递给
initialize.apply

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

attrs
属性的可变*副本<代码>选项
仅可读取,不可写入,因此不需要副本



*JavaScript中的一切都是可变的,但这段代码的行为就好像参数是不可变的。

这不太正确<代码>属性是对与
属性
相同的对象的引用,因此代替
属性
的更新也会影响
属性
。如果代码是
var attrs=54;.clone(attributes)|{}
那么您就对了。@WillDemaine
\默认值({}…
负责克隆仍然不能保证属性是不变的,因为它在调用
\默认值
之前被传递给
this.parse
(作为属性)。
  var Model = Backbone.Model = function(attrs, options) {
    attrs  || (attrs  = {});