我无法理解的主干库代码模式

backbone library code patterns I couldn't understand

本文关键字:代码 模式      更新时间:2023-09-26

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

这是在 Backbone 中进行初始设置的一些代码片段,请帮助我理解它。

代码1 -

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

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

(function(root){
})(this);

代码2 -

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

现在在全局范围内没有导出的定义,在本地范围内的任何地方也没有定义,那么如果我正在编写与我会编写的相同代码,那么如果块在这里做什么

  var Backbone = root.Backbone = {};

代码 3

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

再次,我在本地或全局范围内的任何地方都找不到需求的定义

代码块 1

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

代码块 2

此块是对 AMD 样板的采用。 AMD 库提供了将 JavaScript 代码拆分为模块所需的钩子。 在代码块的情况下,exports对象是 CommonJS 模块标准使用的全局对象。 如果全局exports不存在,则主干将直接添加到root对象。

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

代码块 3

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

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

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

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

@JonnyReeves几乎

回答了你所有的问题。不确定您是否看过 Backbone 的注释源代码.js之前,这对您很有用。

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