gpt4 book ai didi

javascript - 为什么 Backbone.js 模型的 'on()' 将 'this' 作为最后一个参数,如果它几乎总是这样的话?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:17:01 25 4
gpt4 key购买 nike

我刚刚接触 Backbone,我不明白的一件事是为什么模型的“on()”方法总是采用三个参数——事件、处理程序和上下文。

似乎几乎总是“this”用于上下文,我还没有看到任何其他用法。就算有,我也没见过,应该是很少见吧。

所以我的问题是:什么时候使用“this”以外的上下文,为什么 Backbone 是这样设计的?顺便说一句,我确实理解您为什么需要提供上下文,只是我想知道为什么方法语法指定我使用三个参数而不是使最后一个参数可选——这似乎总是“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 */
    });

最佳答案

假设我们在一个基于模型的 View 中并且我们想要绑定(bind)到模型的更改事件:

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

on 调用会看到两件事:

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

on 无法知道 this.render 中的 this 是什么意思,它只是看到一个函数; on 甚至不知道上面调用和这个调用之间的区别:

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

如果您的函数需要特定的上下文,那么您有两种选择:

  1. 使用 _.bind 创建绑定(bind)函数, _.bindAll , Function.bind , $.proxy , CoffeeScript =>var _this = this 闭包技巧,或任何创建或模拟绑定(bind)函数的方法。
  2. 通过以下方式告诉它您想要的上下文:

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

无法展开调用堆栈来查看您想要哪个 this,因此您必须明确说明。

Backbone 将像这样调用回调:

node.callback.apply(node.context || this, ...);

其中 node.callback 是回调函数,node.context 是给 on 的第三个参数(如果有的话)。如果您不指定上下文,那么当 trigger 被调用时,您将得到任何 this;在上面的示例中,this 最终将成为模型。

所以 on 的第三个参数实际上是可选的,但默认值不是很有用,也没有办法选择更好的默认值,选择合理上下文所需的信息只是' 可在 JavaScript 中访问。这就是为什么您在 Backbone View 中看到如此多的 _.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);
});

而且这些都没有什么意义。 on 中的 this 的值与调用 on 的代码中的 this 的值几乎没有关系>。 this 在 JavaScript 中不是一个变量,它是一个引用当前调用上下文的关键字。

关于javascript - 为什么 Backbone.js 模型的 'on()' 将 'this' 作为最后一个参数,如果它几乎总是这样的话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com