假设我们在一个基于模型的视图中,并且我们想要绑定到模型的更改事件:
this.model.on('change', this.render);
on
通话看到两件事:
- 事件名称,一个简单的字符串。
- 处理程序,一个函数。
on
无法知道 in 是什么this
意思this.render
,它只是看到一个函数;on
甚至不知道上面的调用和这个之间的区别:
this.model.on('change', function() { ... });
如果您的函数需要特定的上下文,那么您有两种选择:
- 使用、、、、、CoffeeScripts
_.bind
、闭包技巧或任何创建或模拟绑定函数的方法来创建绑定_.bindAll
函数。Function.bind
$.proxy
=>
var _this = this
告诉它你想要哪个上下文:
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);
});
并且没有任何意义。this
inside的值与调用 的代码中on
的值几乎没有关系。在 JavaScript 中不是变量,它是一个关键字,指的是当前调用上下文。this
on
this