我正在this tutorial之后学习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 are self-rendering. This one is.
},
...
});
...
})(jQuery);
Q1:为什么要使用(function($){})(jQuery)
;而不是完美的工作(function(){})();
?
Q2:_.bindAll(this, 'render')
做了什么?它如何修复方法中'this'的上下文丢失?
答案 0 :(得分:8)
Q1:通过将jquery作为参数传递,你可以自己做两件事:
Q2:bindAll
是来自Underscore.js的实用程序方法,它为特定方法绑定this
- 因此,当调用该方法(例如作为回调)时,正确的{{1}将在其中使用。
例如:
this
在您的代码的某些部分中,您执行以下操作:
(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);
方法中的 this
是对上述makestuff
的引用,而不是list
函数在其中实际调用on
时所处的任何上下文
实际实现依赖于使用makestuff
和apply
函数将函数执行的上下文绑定到特定对象。
答案 1 :(得分:2)
(function($){})(jQuery)
将jQuery
传递给自行执行,并将其用作$
。这可以确保您可以安全地使用闭包内的$
符号,而不必担心与其他库甚至其他版本的jQuery的干扰。这种做法的一个常见例子也是传入window
和document
,然后在闭包内使用缩写:
(function(w, d, $){
$(w).resize(function({}); //equals $(window) now
})(window, document, jQuery);
下划线_.bindAll
执行以下操作:
将methodNames指定的对象上的多个方法绑定到 无论何时调用它们,都要在该对象的上下文中运行。非常 方便用于将用作事件的绑定函数 处理程序,否则将被调用相当无用的。 如果没有提供methodNames,则为对象的所有功能 属性将绑定到它。
请参阅 the annotated source 了解具体方法。