Backbone在前50行代码中暴露自己。
JQuery在最后50行代码中。
为什么会有差异?
这只是随机的开发者选择。或者我有没有在这里看到的目的。
Backbone = root.Backbone = {}; // line 33
window.jQuery = window.$ = jQuery; // near bottom..can someone post github link
答案 0 :(得分:2)
Backbone似乎使用对象原型设计并在之后应用功能/功能。
jQuery似乎创建了一个闭包,并在以后将它暴露给全局范围,因为在noConflict-Mode中有可能不暴露“$”而只暴露“jQuery”。这似乎也确保了“ready”-Event在定义所有动作之前不会太早运行,因为JS可以通过其回调来获得一些棘手的竞争条件......
答案 1 :(得分:1)
基于部署上下文的开发人员选择。
Backbone(更值得注意的是Underscore)被编写为更通用的JavaScript库,可以选择用于服务器端(Node.js)或浏览器外部使用。因此,它在其中工作的上下文变得更加可变,并且它对该上下文的附加对于与common.js和require.js之类的东西一起使用时更加柔韧。因此,早期关注周围环境而不是库本身的可用性,特别是因为Backbone用于通常更加定义和定制命名空间的环境中(包括开发人员更积极参与的丰富浏览器应用程序)在那些关注中)。
jQuery的设计目的是在Web浏览器中使用。因此上下文是固定的,jQuery可以在命名空间中构建库。然后,jQuery的重点转向在特定位置(如$
或jQuery
)随时可用且易于使用,同时允许在经常被污染的浏览器环境中避免冲突:最初提供生命线混乱,而不是适应更大的结构化环境(如它成为插件的监护人,而不是促进更高的模块化)。
答案 2 :(得分:0)
好问题。 Backbone可以在服务器端或客户端工作。 jQuery被用于在必须存在全局窗口对象的DOM环境中工作。在像Node这样的服务器端环境中,全局对象称为global
。
你很接近但Backbone源中设置这个的实际部分实际上是前2行和最后一行:
(function(){
var root = this;
...
}).call(this);
与大多数框架一样,Backbone以匿名函数开始封装其设置,但在这种情况下,它在全局范围this
的上下文中调用该方法,该范围在Web客户端中解析为window
和服务器端节点上的global
。
请注意,jQuery可能不会做这样的事情,因为它依赖于许多DOM方法,如document.getElementById
。但是,可以在服务器端创建虚拟DOM环境以加载jQuery。请参阅JSDOM之类的项目。
以下是我给出的演讲的幻灯片,其中我将介绍这个话题: https://speakerdeck.com/krunkosaurus/deep-dive-into-backbone-dot-js-internals-plus-underscore-dot-js