Javascript 无法理解backbone.js教程示例
我正在学习backbone.js,但在理解第一个示例时遇到了问题:Javascript 无法理解backbone.js教程示例,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我正在学习backbone.js,但在理解第一个示例时遇到了问题: (function($){ var ListView = Backbone.View.extend({ ... initialize: function(){ _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods this.render(); // not all views ar
(function($){
var ListView = Backbone.View.extend({
...
initialize: function(){
_.bindAll(this, 'render'); // fixes loss of context for 'this' within methods
this.render(); // not all views are self-rendering. This one is.
},
...
});
...
})(jQuery);
问题1:为什么要使用(函数($){})(jQuery)
;而不是一个完美的工作(function(){})()代码>
问题2:.bindAll(这个“呈现”)做什么?它如何修复方法中“this”上下文的丢失?Q1:通过将jquery作为参数传入,您可以实现两件事:
如果需要使用两个版本的jquery,您已经准备好了
模块模式可能更好地被认为是封装良好、具有定义良好的依赖关系的东西,所以通过声明jquery是一个参数,您就可以声明清晰的依赖关系。当然还有其他的方法(比如),但这也是一种方法
问题2:bindAll
是substander.js中的一个实用方法,它为特定方法绑定此
——因此,当调用该方法(例如作为回调)时,将在其内部使用正确的此
例如:
(function($){
var ListView = Backbone.View.extend({
...
initialize: function(){
// fixes loss of context for 'this' within methods
_.bindAll(this, 'render', 'makestuff');
this.render(); // not all views are self-rendering. This one is.
},
...
makestuff : function() {
...
this.stuff = ... // some action on the list's instance
}
});
...
})(jQuery);
在代码的某些部分,您可以执行以下操作:
var list = new ListView({...});
$('#button').on('click', list.makestuff);
在makestuff
方法中,此是对上述列表的引用,而不是在makestuff
函数内部实际调用时,on
函数所处的任何上下文
实际实现依赖于使用apply
和call
函数将函数执行的上下文绑定到特定对象。(函数($){})(jQuery)
将jQuery
传递给将其用作$
的自执行对象。这确保了您可以在闭包中安全地使用$
符号,而不必担心与其他库甚至其他版本的jQuery的干扰。这种做法的一个常见示例是传入窗口
和文档
,然后在闭包内使用速记:
(function(w, d, $){
$(w).resize(function({}); //equals $(window) now
})(window, document, jQuery);
下划线的。.bindAll
执行以下操作:
将对象上由MethodName指定的许多方法绑定到
无论何时调用它们,都可以在该对象的上下文中运行。非常
对于将用作事件的绑定函数非常方便
处理程序,否则将以相当无用的方式调用。
如果没有提供MethodName,则对象的所有函数
属性将绑定到它
请参见了解操作方法。谢谢,另一个答案解释得更详细,对不起,我选择了他