我正在尝试学习Backbone.js。 在我的使用Backbone和RequireJS的应用程序中,我有以下代码;
define([
'base/BaseView',
'model/BaseModel',
], function(BaseView,
BaseModel){
var myView = BaseView.extend({
initialize: function() {
this.Summary = new resultSummary({
scenId : this.options.scenario.get("scenId")
});
},
renderCount : function(){
var self = this;
var currentStatus = self.model.get("myStatus");
}
render: function () {
var self = this;
var gridItems = [];
gridItems.push({
id: "company.status",
text: "Status",
width: "200px",
renderer: function() {
var partnerStatus = this.company.get("status");
}
});
}
}
});
我对一些概念不太清楚;
答案 0 :(得分:2)
我想你在问关闭?
我们分配
var self = this;
所以我们可以在嵌套函数中保留类的范围。在这种情况下:
renderer: function() {
var partnerStatus = this.company.get("status");
}
这是一个很好的阅读:"Closures - JavaScript | MDN"
答案 1 :(得分:2)
我可能无法回答所有问题,因为有问题的代码可能是从较大的代码库中复制而来的。
var self = this; 用于避免范围问题。有时,当您使用回调时,此可能会更改为其他对象。有问题的代码不会以任何方式从中受益这个可以直接使用。
有用的示例 - 让我们说,我们需要监听模型中的更改,并且我们希望在initialize方法中附加处理程序并从更改视图中调用一些逻辑:
// view code
initialize: function() {
console.log(this); // 'this' points to view
this.listenTo(this.model, "change", function() {
console.log(this); // 'this' points to model
// calling 'this.someLogic();' would throw exception
});
},
someLogic: function() {
// ..
}
为避免第一个示例中描述的问题,您需要将视图上下文中的“this”存储在其他变量中(不必命名为self)。
重写的例子:
// view code
initialize: function() {
console.log(this); // 'this' points to view
var self = this; // store this into variable that will won't be changed in different scope
this.listenTo(this.model, "change", function() {
console.log(this); // 'this' points to model
console.log(self); // 'self' points to view
self.someLogic(); // won't throw
});
},
someLogic: function() {
// ..
}
我建议您检查JavaScript中的闭包是如何工作的。它不仅适用于Backbone,而且适用于JavaScript开发。
不,Backbone会将'this'指向view对象,其中包含那些方法。
不知道,我只能猜测,它是来自 BaseView
的一些属性