3

我刚刚进入 Backbone,我不明白的一件事是为什么模型的“on()”方法总是需要三个参数——事件、处理程序和上下文。

似乎几乎总是“this”用于上下文,我还没有看到任何其他用法。即使有,因为我还没有见过它,它一定是非常罕见的。

所以我的问题是:什么时候使用“this”以外的上下文,为什么 Backbone 是这样设计的?顺便说一句,我确实理解您为什么需要提供上下文,只是我想知道为什么方法语法指定我使用三个参数而不是使最后一个参数可选 - 这似乎总是“this”并且感觉多余。我确定我错过了一些东西。请有人帮我理解。谢谢!

  • [编辑] 为什么不能做这样的事情:

    model.on = function(event, callback){
      model.on_with_three_args.call(this, event, callback, this);
    });
    
    model.on_with_three_args = function(event, callback){
      /* whatever the on() is supposed to do */
    });
    
4

1 回答 1

9

假设我们在一个基于模型的视图中,并且我们想要绑定到模型的更改事件:

this.model.on('change', this.render);

on通话看到两件事:

  1. 事件名称,一个简单的字符串。
  2. 处理程序,一个函数。

on无法知道 in 是什么this意思this.render,它只是看到一个函数;on甚至不知道上面的调用和这个之间的区别:

this.model.on('change', function() { ... });

如果您的函数需要特定的上下文,那么您有两种选择:

  1. 使用、、、、、CoffeeScripts _.bind、闭包技巧或任何创建或模拟绑定函数的方法来创建绑定_.bindAll函数。Function.bind$.proxy=>var _this = this
  2. 告诉它你想要哪个上下文:

    this.model.on('change', this.render, this);
    

无法展开调用堆栈以查看this您想要的,因此您必须明确说明。

Backbone 将像这样调用回调:

node.callback.apply(node.context || this, ...);

wherenode.callback是回调函数,node.context是给 . 的第三个参数(如果有的话)on。如果您不指定上下文,那么您将得到调用this时发生的任何事情trigger;在上面的示例中,this最终将成为模型。

因此,实际上的第三个参数on是可选的,但默认值并不是非常有用,并且无法选择更好的默认值,您需要选择合理上下文的信息在 JavaScript 中根本无法访问。_.bindAll(this, ...)这就是为什么您会在 Backbone 视图中看到如此多的样板。


如果您尝试过这样的事情:

model.on = function(event, callback){
    model.on_with_three_args.call(this, event, callback, this);
});

那么this在那种情况下通常会model这样你真的会说:

model.on = function(event, callback){
    model.on_with_three_args.call(model, event, callback, model);
});

或者

model.on = function(event, callback){
    model.on_with_three_args(event, callback, model);
});

并且没有任何意义。thisinside的值与调用 的代码中on的值几乎没有关系。在 JavaScript 中不是变量,它是一个关键字,指的是当前调用上下文。thisonthis

于 2012-10-30T05:31:27.777 回答