Javascript 为什么Backbone.js型号为';s';on()';以';这';如果为';几乎总是这样吗?

Javascript 为什么Backbone.js型号为';s';on()';以';这';如果为';几乎总是这样吗?,javascript,backbone.js,this,backbone-events,Javascript,Backbone.js,This,Backbone Events,我刚刚进入主干,有一件事我不明白,为什么模型的“on()”方法总是包含三个参数——事件、处理程序和上下文 似乎“this”几乎总是用于上下文,我没有看到任何其他用法。即使有,因为我还没见过,那一定很少见 所以我的问题是:什么时候使用“this”以外的上下文,为什么主干网是这样设计的?顺便说一句,我确实理解为什么需要提供上下文,只是我想知道为什么方法语法指定我使用三个参数,而不是将最后一个参数设置为可选的——这似乎总是“this”,而且感觉是多余的。我肯定我错过了什么。请有人帮我理解。谢谢大家!

我刚刚进入主干,有一件事我不明白,为什么模型的“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() { ... });
    
    如果函数需要特定上下文,则有两种选择:

  • 使用、、CoffeeScripts、
    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”上?