我刚刚进入骨干,一两件事,我不明白的是为什么模型“上()”方法总是带有三个参数 - 事件,处理程序和上下文。
看来,几乎总是“这个”被用于上下文,我还没有看到任何其他用途。 即使有,因为我还没有看到一个。它必须是非常罕见的。
所以我的问题是:什么时候一个比使用“这”以外的背景下,为什么是主干这样设计? 顺便说一句,我不明白为什么你需要提供上下文,它只是我不知道为什么该方法的语法规定,我用三个参数,而不是把最后一个参数可选 - 这似乎是永远“这个”,感觉多余的。 我敢肯定,我失去了一些东西。 请人帮助我了解。 谢谢!
[编辑]为什么不能在一个这样做:
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
呼叫看到两件事情:
- 事件名称,一个简单的字符串。
- 处理程序,函数。
on
有没有知道什么方式this
意味着this.render
,它只是看到一个功能; on
甚至不知道上面的电话,这之间的区别:
this.model.on('change', function() { ... });
如果你的函数需要一个特定的背景下,你有两个选择:
- 通过创建绑定功能
_.bind
, _.bindAll
, Function.bind
, $.proxy
,CoffeeScripts =>
该var _this = this
封闭的把戏,或者任何的创建或模拟绑定功能的方式。 告诉你想要说什么背景下:
this.model.on('change', this.render, this);
有没有办法解开调用栈,看看哪些this
你要那么你必须要明确一下。
骨干网将这样调用回调:
node.callback.apply(node.context || this, ...);
其中node.callback
是回调函数和node.context
是第三个参数(如果有的话)提供给on
。 如果不指定范围内,那么你会得到什么this
恰好是当trigger
被调用; 在上面的例子中, this
将最终被模型。
所以第三个参数on
实际上是可选的,但默认值是不是非常有用的,也没有办法选择一个更好的默认情况下,你需要选择一个合理的范围内的信息根本不是在JavaScript访问。 这就是为什么你看到这么多_.bindAll(this, ...)
在骨干观点样板。
如果你试过这样的事情:
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
里面on
有一点,如果任何与价值做this
在调用的代码on
。 this
在JavaScript是不是一个变量,它是指当前调用上下文关键字。
文章来源: Why does Backbone.js model's 'on()' take 'this' as last parameter if it's almost always going to be this?