为什么Backbone.js的模型的“关于()”取“这个”作为最后一个参数,如果它几乎总是会这样?(

2019-08-02 02:34发布

我刚刚进入骨干,一两件事,我不明白的是为什么模型“上()”方法总是带有三个参数 - 事件,处理程序和上下文。

看来,几乎总是“这个”被用于上下文,我还没有看到任何其他用途。 即使有,因为我还没有看到一个。它必须是非常罕见的。

所以我的问题是:什么时候一个比使用“这”以外的背景下,为什么是主干这样设计? 顺便说一句,我不明白为什么你需要提供上下文,它只是我不知道为什么该方法的语法规定,我用三个参数,而不是把最后一个参数可选 - 这似乎是永远“这个”,感觉多余的。 我敢肯定,我失去了一些东西。 请人帮助我了解。 谢谢!

  • [编辑]为什么不能在一个这样做:

     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 */ }); 

Answer 1:

假设我们在这是基于模型的观点,我们要绑定到模型的变化事件:

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

on呼叫看到两件事情:

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

on有没有知道什么方式this意味着this.render ,它只是看到一个功能; on甚至不知道上面的电话,这之间的区别:

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

如果你的函数需要一个特定的背景下,你有两个选择:

  1. 通过创建绑定功能_.bind_.bindAllFunction.bind$.proxy ,CoffeeScripts =>var _this = this封闭的把戏,或者任何的创建或模拟绑定功能的方式。
  2. 告诉你想要说什么背景下:

     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在调用的代码onthis在JavaScript是不是一个变量,它是指当前调用上下文关键字。



文章来源: Why does Backbone.js model's 'on()' take 'this' as last parameter if it's almost always going to be this?