6

我是中级 javascript 开发人员,试图了解 javascript 开发人员如何编写他们的代码,我决定开始研究 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')._;

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

4

4 回答 4

6

代码块 1

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

代码块 2

这个块是AMD Boiler Plate的一部分。AMD 库提供了将 JavaScript 代码拆分为模块所需的挂钩。在代码块的情况下,exports对象是CommonJS 模块标准使用的全局对象。如果exports全局不存在,则root直接将 Backbone 添加到对象中。

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

代码块 3

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

于 2012-08-16T09:55:33.460 回答
2

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

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

于 2012-08-16T09:44:40.210 回答
0

我认为代码 2 是为了保护框架,以防其他人在全局范围内定义导出。所以他们检查它是否不是未定义的意思是其他人做了然后他们只是将它重置为一个空对象。

于 2012-08-16T09:42:54.237 回答
0

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

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

于 2012-08-17T05:52:46.210 回答