Javascript 为什么Backbone.js型号为';s';on()';以';这';如果为';几乎总是这样吗?
我刚刚进入主干,有一件事我不明白,为什么模型的“on()”方法总是包含三个参数——事件、处理程序和上下文 似乎“this”几乎总是用于上下文,我没有看到任何其他用法。即使有,因为我还没见过,那一定很少见 所以我的问题是:什么时候使用“this”以外的上下文,为什么主干网是这样设计的?顺便说一句,我确实理解为什么需要提供上下文,只是我想知道为什么方法语法指定我使用三个参数,而不是将最后一个参数设置为可选的——这似乎总是“this”,而且感觉是多余的。我肯定我错过了什么。请有人帮我理解。谢谢大家!Javascript 为什么Backbone.js型号为';s';on()';以';这';如果为';几乎总是这样吗?,javascript,backbone.js,this,backbone-events,Javascript,Backbone.js,This,Backbone Events,我刚刚进入主干,有一件事我不明白,为什么模型的“on()”方法总是包含三个参数——事件、处理程序和上下文 似乎“this”几乎总是用于上下文,我没有看到任何其他用法。即使有,因为我还没见过,那一定很少见 所以我的问题是:什么时候使用“this”以外的上下文,为什么主干网是这样设计的?顺便说一句,我确实理解为什么需要提供上下文,只是我想知道为什么方法语法指定我使用三个参数,而不是将最后一个参数设置为可选的——这似乎总是“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 */ });
this.model.on('change', this.render);
调用上的可以看到两件事:
事件名称,一个简单的字符串
处理程序,一个函数
在
上的无法知道这个在这个中意味着什么。渲染,它只看到一个函数on
甚至不知道上面的调用与下面的调用之间的区别:
this.model.on('change', function() { ... });
如果函数需要特定上下文,则有两种选择:
var\u this=this
闭包技巧或任何创建或模拟绑定函数的方法创建绑定函数this.model.on('change', this.render, this);
this
,因此必须明确说明
主干将按如下方式调用回调:
node.callback.apply(node.context || this, ...);
model.on = function(event, callback){
model.on_with_three_args.call(this, event, callback, this);
});
其中,node.callback
是回调函数,node.context
是给上的的第三个参数(如果有)。如果您不指定上下文,那么当调用触发器时,您将得到该发生的任何内容;在上面的例子中,这个
将最终成为模型
因此
上的的第三个参数实际上是可选的,但是默认值并没有太大用处,也没有办法选择更好的默认值,选择合理上下文所需的信息在JavaScript中根本无法访问。这就是为什么您在主干视图中看到如此多的.bindAll(这个,…)
样板文件
如果您尝试过类似的方法:
node.callback.apply(node.context || this, ...);
model.on = function(event, callback){
model.on_with_three_args.call(this, event, callback, this);
});
然后这个
在这个上下文中通常是模型
,所以你真的会说:
model.on = function(event, callback){
model.on_with_three_args.call(model, event, callback, model);
});
或
这些都没有什么意义。this
内部on
的值与调用on
的代码中this
的值几乎没有任何关系这个
在JavaScript中不是一个变量,而是一个引用当前调用上下文的关键字。谢谢您的回答!我不知道这是可选的。让我确保我理解正确。根据您的代码node.callback.apply(node.context | | this,…);这难道不意味着默认上下文确实是“this”吗?我不明白你为什么说它不是非常有用。另外,要澄清的是,如果我们使用第三个参数“this”,那么实际上并不需要_u.bindAll(this,…),对吗?为什么这么多人在代码中使用u.bindAll?@Vlad:this
的值总是取决于上下文。调用this.model.on(…)
时,this
是什么,与调用trigger
时,this
是什么不同此
不是一个变量,它只是看起来像一个变量。如果可以在上使用三个参数,为什么要使用.bindAll
?历史个人偏好?为了处理没有通过主干的on
的情况下的绑定,也许?所以基本上第三个参数被绑定到这个.model.on的闭包中,这样即使在它返回后,它仍然绑定到最初调用model.on()时的“this”上?