骨干库代码模式我无法理解

时间:2012-08-16 09:25:34

标签: javascript backbone.js

我是中级javascript开发人员,试图了解javascript开发人员如何编写他们的代码,我决定开始寻找Backbone库作为起点。

这里有一些用于骨干初始设置的代码片段,请帮助我理解它。

code1 -

(function(){
   var root = this;
}).call(this);

是否有任何特定的理由使用调用方法而不是简单地使用(),或者它只是一个编码首选项,如果我必须写相同的代码,我会做这样的事情。

(function(root){

})(this);

code2 -

  var Backbone;
  if (typeof exports !== 'undefined') {
    Backbone = exports;
  } else {
    Backbone = root.Backbone = {};
  }

现在在全局范围内没有导出的定义,也没有在本地范围内的任何地方定义,那么如果我正在编写相同的代码,那么if是什么呢?

  var Backbone = root.Backbone = {};

代码3

var _ = root._;
if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;

我无法在本地或全球范围内找到需求的定义

4 个答案:

答案 0 :(得分:6)

代码块1

这取决于开发人员的偏好,您可以用任何一种方式编写代码,实际上,许多库确实更喜欢您建议的样式。

代码块2

这个块是对AMD Boiler Plate的看法。 AMD库提供了split your JavaScript code into modules所需的钩子。在代码块的情况下,exports对象是CommonJS Module Standard使用的全局对象。如果exports全局不存在,则Backbone将直接添加到root对象。

有趣的一点是,Backbone不支持导出到流行的RequireJS AMD库。

代码块3

require是AMD库引入的另一个全球,见上文。

答案 1 :(得分:2)

code1 call(this)中将当前this的引用传递给该函数。如果在全球范围内执行此操作,thiswindow。我认为这只是偏好,在这种情况下没有任何区别。

requireexports由NodeJS(或CommonJS兼容库)提供,它们是CommonJS规范的一部分。

答案 2 :(得分:0)

我认为代码2是为了保护框架,以防其他人在全局范围内定义导出。因此,他们检查是否有其他未定义的含义,然后他们只是将其重置为空对象。

答案 3 :(得分:0)

@JonnyReeves已经回答了你所有的问题。不确定您之前是否看过了带有注释的backbone.js源代码,这对您有用。

http://documentcloud.github.com/backbone/docs/backbone.html