为什么将 Backbone 和 Handlebar 的上下文放入初始化函数中会消除错误?

Why does putting Backbone and Handlebar's context into initialize function remove error?

我很确定这是一个一般的 JS 问题,不仅限于 Backbone,但我在学习 Backbone 时遇到了这个问题。在下面的第一个示例中,我没有收到错误,但第二个示例却不一样。你能解释一下幕后发生的事情是什么让 Chrome 开发工具在后一个例子中显示错误,而不是在第一个例子中。我最好的猜测是,当某些东西在函数中时(例如初始化),它不会立即获得 运行 因为浏览器正在读取脚本,而如果它是正在定义的 class 的一部分(在这种情况下,app.ItemView),需要完成对象上下文,因此浏览器需要通读 this.model#get 以构建上下文对象。

app.ItemView = Backbone.View.extend({
    initialize: function() {
        this.context = {
            title: this.model.get("title"),
            completed: this.model.get("completed")
        }
    }
});

对比

app.ItemView = Backbone.View.extend({
    context: {
        title: this.model.get("title"),
        completed: this.model.get("completed")
    }
});

未捕获类型错误:无法读取未定义的 属性'get'

编辑:如果第一个示例中的上下文未正确定义,它也不起作用 -

app.ItemView = Backbone.View.extend({
    initialize: function() {
        this.context.title = this.model.get("title");
        this.context.completed = this.model.get("completed");
        this.render();
    }
});

未捕获类型错误:无法读取未定义的 属性'get'

编辑阅读mu is too short的评论后更正了this的解释。

错误的主要原因是您的第二段代码中的 this 可能引用 window 或调用 Backbone.View.extend 的函数的调用者。

该对象没有 model 属性,所以它是 undefined 并且在 undefined 上调用 get 导致错误。

您需要使 initialize 成为一个函数,因为它可能会被一个 Backbone.View 对象调用,该对象确实有 model 属性 可用。在这种情况下,this 将引用 Backbone.View 对象。