下划线标记在骨干中的作用是什么?我们何时使用它?

时间:2012-06-29 19:30:23

标签: javascript backbone.js underscore.js

我正在经历学习骨干的过程,并且不了解所有语法。下面我介绍了一些我一直在学习骨干的代码,所以我可以在这个问题中引用它。虽然我得到了大部分骨干的工作原理,但我并不完全理解一些代码中一些标记背后的含义。 BackBone的文档来源充其量是最少的。我得到它的90%但是我没有得到的语法是下划线'_'真正提供什么以及何时使用它。例如下面有一些代码在“.bindAll(....”中使用下划线。当然我确实理解绑定是什么。只是不确定何时使用下划线以及标记起什么作用。另一个例子是当下划线显示在下面的'(this.collection.models).each(function(item)...'代码之前。我得到代码正在循环但是为什么他们使用下划线标记。感谢您的帮助

(function($){

  var Item = Backbone.Model.extend({
    defaults: {
      part1: 'hello',
      part2: 'world'
    }
  });    
   var List = Backbone.Collection.extend({
    model: Item
  });

  var ListView = Backbone.View.extend({
    el: $('body'),
    events: {
      'click button#add': 'addItem'
    },
    initialize: function(){
      _.bindAll(this, 'render', 'addItem', 'appendItem'); // remember: every function that uses 'this' as the current object should be in here

      this.collection = new List();
      this.collection.bind('add', this.appendItem); // collection event binder

      this.counter = 0;
      //once the object is initialized, render the page.
      this.render();      
    },
    render: function(){
    var self = this;      
      $(this.el).append("<button id='add'>Add list item</button>");
      $(this.el).append("<ul></ul>");
      _(this.collection.models).each(function(item){ // in case collection is not empty
    self.appendItem(item);
      }, this);
    },
    addItem: function(){
      this.counter++;
      var item = new Item();
      item.set({
    part2: item.get('part2') + this.counter // modify item defaults
      });
      this.collection.add(item); // add item to collection; view is updated via event 'add'
    },
     appendItem: function(item){
      $('ul', this.el).append("<li>"+item.get('part1')+" "+item.get('part2')+"</li>");
    }
  });

  var listView = new ListView();
})(jQuery);

4 个答案:

答案 0 :(得分:3)

Underscore只不过是一个高效的跨浏览器的实用程序/有用函数集合。下划线的每个函数都以下划线字符_开头(因此命名为Underscore)。

(强调我的)

  

Underscore是一个用于JavaScript的实用程序带库,它提供了一个   很多你期望的功能性编程支持   Prototype.js(或Ruby),但是没有扩展任何内置的   JavaScript对象。这是与jQuery的礼服一起使用的关系   Backbone.js的吊带。

骨干网也可以拥有自己的一套功能,但由于需要的实用功能已经存在于Underscore中,因此它们被骨干使用。换句话说,Backbone与Underscore结合使用,可为编程/功能需求提供更多功能和灵活性。

请注意,Backbone和Underscore都是由同一作者撰写的。

详细了解文档:

http://underscorejs.org/

答案 1 :(得分:0)

最好将下划线视为或多或少的方便实用程序功能的命名空间。他们只是使用下划线来防止污染全局命名空间。

有关此信息的更多信息,最好阅读文档:underscore

特别是,您似乎注意到的用法是chaining

答案 2 :(得分:0)

Underscore本身就是一个库,Backbone恰好在其源代码中使用。它的API完全包含在_命名空间中,一个对象。

Underscore主要关注JavaScript在数据级别的原生API的扩展。也就是说,对于数组交叉的方法比对DOM操作(即jQuery专门研究的)更感兴趣。

它还有一个模板系统,这是Backbone使用的其他功能。

答案 3 :(得分:0)

Underscore.js是由Backbone.js的创建者DocumentCloud编写的javascript实用程序库。

它可以作为Backbone.js之外的可分发的,这就是为什么它有自己的命名空间。

它通过为各种功能语言结构提供接口来帮助开发人员,这些结构不一定是所有浏览器本身都支持的。

Underscore.js Documentation

例如:

bindAll_.bindAll(object, [*methodNames]) 
  

将methodNames指定的对象上的多个方法绑定到   无论何时调用它们,都要在该对象的上下文中运行。非常   方便用于将用作事件的绑定函数   处理程序,否则将被调用相当无用的。   如果没有提供methodNames,则为对象的所有功能   属性将绑定到它。