在这个Backbone TodoMVC示例中,这些模式是什么?
What are these patterns in this Backbone TodoMVC example
查看todomvc主干代码示例。js/fold:
中的结构├── app.js
├── collections
│ └── todos.js
├── models
│ └── todo.js
├── routers
│ └── router.js
└── views
├── app-view.js
└── todo-view.js
app.js
var app = app || {};
$(function () {
'use strict';
// kick things off by creating the `App`
new app.AppView();
});
集合/todos.js
var app = app || {};
(function () {
'use strict';
var Todos = Backbone.Collection.extend({
model: app.Todo,
app.todos = new Todos();
})();
模型/todo.js
var app = app || {};
(function () {
'use strict';
app.Todo = Backbone.Model.extend({
});
})();
视图/app-view.js
var app = app || {};
(function ($) {
'use strict';
app.AppView = Backbone.View.extend({
})(jQuery);
我有两个问题:
为什么
var app = app || {}
在每个文件?$(function(){})
、(function(){})()
、(function($))(jQuery)
有何区别
-
app
变量是全局的,封装了整个骨干应用程序以最小化全局命名空间污染。在这里您可以找到更多关于命名空间模式的详细信息。var app = app || {}
用新的空对象初始化全局app
变量,如果它还没有初始化。 -
功能:
-
$(function(){})
是jQuery的$(document).ready(function(){})
的快捷方式。文档 -
(function(){})()
是一个不带参数的即时调用函数表达式(IIFE) -
(function($){ /* here $ is safe jQuery object */ })(jQuery)
是具有参数的IIFE -jQuery
对象将作为$
传递到匿名函数
-
$(function() {
console.log("Document ready event");
});
$(document).ready(function() {
console.log("Document ready event");
});
(function() {
console.log("Immediately-invoked function expression without parameters");
})();
(function($) {
console.log("Immediately-invoked function expression with parameter. $ is a jQuery object here:");
console.log($.fn.jquery);
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
虽然Yurii解释了所有模式之间的区别,但它缺少"为什么"您需要这些模式。
命名空间和作用域
以下模式的总体目标主要是名称空间和作用域,具有不同的优点。避免污染全局命名空间是一种很好的做法,而且由于JavaScript没有将命名空间作为核心特性,因此出现了其他模式来解决这个问题。
请参见如何声明命名空间。
全局名称空间
var app = app || {}; // if it doesn't exist yet, make it an new object.
为了避免污染全局命名空间(也就是使所有东西都成为全局变量),你只创建一个变量,在其中插入应用程序的所有其他模块。
然后,每个文件将其模块导出到唯一的全局变量。
请注意,如果一个模块依赖于另一个模块,那么文件的顺序仍然很重要。
如果我们看一下TodoMVC的例子,它们以特定的顺序包含了这些文件:
<script src="js/models/todo.js"></script>
<script src="js/collections/todos.js"></script>
<script src="js/views/todo-view.js"></script>
<script src="js/views/app-view.js"></script>
<script src="js/routers/router.js"></script>
<script src="js/app.js"></script>
范围
假设您在一个文件中声明了var test = 2;
,它是整个模块中使用的关键变量。然后,在另一个文件中,复制在第一个模块中使用的良好模式。您刚刚覆盖了test
变量,现在,它在两个模块之间非自愿共享。
为了使局部函数和变量私有于一个模块,你可以使用立即调用函数表达式(IIFE)来限定它们的作用域。块作用域是相对较新的,还没有得到很好的支持,所以最安全的方法是使用函数作用域。
var app = app || {}; // global
(function () {
// private to this scope
var Todos = Backbone.Collection.extend({});
// export the Todos constructor to the global app namespace
app.Todos = Todos;
function localFunction(param) { /** snip **/ }
})();
- 不确定我在PHP AJAX中使用的是什么开发模式
- 将JavaScript检测与MVC4显示模式集成的最佳方式是什么
- 在Backbone.js'上设置属性的模式是什么;模型和视图
- 使用 ES6 模块而不是显示模块模式的额外优势是什么?
- 在 Node.js 中表示状态的普遍接受模式是什么?
- 在vimperator中手动切换到“提示”模式的命令是什么
- 从嵌套数组中获取唯一元素的 JS 模式是什么
- 创建新模型的正确控制器/视图模式是什么
- 在javascript中拆分字符串的正确模式是什么,只留下a-z个单词
- 最好的1-1聊天模式是什么?(AJAX/CI/JQ)
- 使用生成器和迭代器管理流的正确模式是什么
- 文本的正确模式是什么
- 在这个Backbone TodoMVC示例中,这些模式是什么?
- 双64位最小值的位模式是什么?
- 在jquery插件中添加简单的公共方法的最佳模式是什么?
- 在JS模块之间进行数据封送的好模式是什么?
- 开发服务器端node.js的良好架构/模式是什么?
- 这个javascript语法/模式是什么意思
- 执行一段时间后重复的函数的良好模式是什么
- 在JavaScript中,这种情况下的首选模式是什么?