1

我正在尝试学习 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");
                    }
            });     
            }
        }
    });

我对一些概念不是很清楚;

  1. 当我们说 var self = this 时,“this”究竟代表什么(我想将此理解为一个一般性问题,以及当我们在 JS 代码中的任何地方使用“this”时的含义)
  2. 如果我们在上面代码中的“render”中,当我们在 renderCount Vs 中时,我们在初始化 Vs 中,“this”会改变吗?
  3. 对于代码“this.company.get("status")”,this.company究竟代表什么?那是指型号吗?
4

2 回答 2

2

我想你是在问关闭?

我们分配

var self = this;

所以我们可以在嵌套函数中保留类的范围。在这种情况下:

renderer: function() {
                    var partnerStatus = this.company.get("status");
                }

这是一本很好的读物:“闭包 - JavaScript | MDN”

于 2013-07-17T12:24:17.923 回答
2

我可能无法回答所有问题,因为有问题的代码可能是从更大的代码库中复制而来的。

  1. 为什么我们使用 var self = this; 当执行上述代码时,这究竟代表什么?

变种自我=这个;用于避免范围问题。有时,当您使用回调时,可能会更改为其他对象。有问题的代码不会以任何方式从中受益,可以直接使用。

有用的例子——比如说,我们需要监听模型的变化,我们想在初始化方法中附加处理程序,并从视图中调用一些逻辑变化:

// 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 开发也很有用。

  1. 如果我们在上面代码中的“render”中,当我们在 renderCount Vs 中时,我们在初始化 Vs 中,“this”会改变吗?

不,Backbone 会将“this”指向包含那些方法的视图对象。

  1. 对于代码“this.company.get("status")”,this.company究竟代表什么?那是指型号吗?

真的不知道,我只能猜测,这是BaseView的一些属性

于 2013-07-17T12:34:20.690 回答