gpt4 book ai didi

javascript - 事件 - 为什么上下文以两种不同的方式存储?

转载 作者:行者123 更新时间:2023-11-28 20:35:45 24 4
gpt4 key购买 nike

我正在查看source of backbone ,事件部分,并且在大多数情况下它是有意义的,除了上下文被存储两次的行。

在一种情况下,它获取传递给 on() 的值。在第二个实例中,它获取传递的值,但如果没有传递任何值,它将获取当前上下文 - this

on: function(name, callback, context) {
if (!(eventsApi(this, 'on', name, [callback, context]) && callback)) return this;
this._events || (this._events = {});
var list = this._events[name] || (this._events[name] = []);
list.push({callback: callback, context: context, ctx: context || this}); // here
return this;
},

令人困惑的一件事是,有时 this._events[name] 被保存到本地变量 list (打开和关闭),而其他时候它被保存到本地变量效果(触发器)。

明确使用每个

  • .ctx 用于 triggerEvents()
  • .context 用于 off() 中。

最佳答案

当事件触发时,

ctx 用作回调函数内 this 的值。例如,在 View 的 initialize 方法中,您可以执行以下操作:

this.model.on('change', this.render, this); // where 'this' is the view

然后在 render 方法中,当触发该事件时,this 将成为 View 。

context 的使用使得 off 的某些用法可以发挥作用,从而为您提供更多方法来有选择地删除事件回调。例如,如果您想删除上例中添加到模型中的回调,您可以这样做:

this.model.off(null, null, this); // where 'this' is the view from above

这将删除添加到 View 作为上下文传递的模型的任何事件处理程序。

该行不会删除添加的事件,例如:

this.model.on('change', this.foo, bar);  // context is bar

如果您连接了多个事件并希望一次将它们全部删除,同时又不删除使用不同上下文添加的任何回调,那么这可能会很有用。但是,现在 Events 有了 listenTo,使用它可能更容易,因为 View 只需调用 stopListening

contextctx 分开存储的原因是因为它们可以是不同的值。 context 始终是传递给 on 的第三个值,它可以为 null 或未定义,而 ctx 是该值(如果可用),或者

关于javascript - 事件 - 为什么上下文以两种不同的方式存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15418695/

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