gpt4 book ai didi

javascript - Javascript 中的匿名函数引用

转载 作者:行者123 更新时间:2023-11-30 13:36:31 24 4
gpt4 key购买 nike

我目前正在为我正在进行的项目构建一个非常简单的 Observer 类。我已经成功地实现了订阅、取消订阅和通知方法。使用“常规”函数(即:var f = function())时,一切都完全按预期工作。

但是,当我将一个匿名函数传递给订阅方法,然后尝试取消订阅传递“相同”的匿名函数时,它(正如预期的那样)不会从我的数组中删除该函数(毕竟它们是不同的)。

这是我的订阅和取消订阅方法:

this._subscribers = {};
subscribe: function(type, callback) {
if ( isUndefined(this._subscribers[type]) ) {
this._subscribers[type] = [];
}
this._subscribers[type].push(callback);
},
unsubscribe: function(type, callback) {
if ( this._subscribers[type] instanceof Array ) {
var index = this._subscribers[type].indexOf(callback);
if ( index >= 0 ) {
this._subscribers[type].splice(index, 1);
}
}
},

这是我正在测试的代码:

var o = new gaf.events.Observable();
o.subscribe('testEvent', function(event) { alert('Got It!'); });
o.notify('testEvent');
// Correct alerts 'Got It!'
o.unsubscribe('testEvent', function(event) { alert('Got It!'); });
o.notify('testEvent')
// Incorrectly alerts 'Got It!'

我知道我可以使用一个对象(即:_subscribers[event] = {})然后当有东西订阅时我可以添加一个等于回调的新属性和等于回调的值.这将导致 Javascript 将回调转换为字符串。然后我可以使用该字符串查找它(假设传递给 sub/unsub 的方法完全相同)。

但是,这是一个移动项目,我对存储可能长达数百个字符的字符串作为属性非常谨慎,因为我们最终可能会有很多订阅者。

还有其他方法吗?是否有任何小的(微小的,甚至是)哈希库我可以用来哈希函数的字符串值并将其用作属性?将回调的字符串值(以便我可以与它进行比较)存储在数组中(而不是实际的回调)并在其上使用 eval() 会更好吗?

编辑

首先感谢大家的回复!

关于“为什么要传递匿名”函数的所有问题 -

没有理由不使用命名函数。事实上,我同意每个人的观点,命名函数将是更好的解决方案。我只是在收集信息并寻找解决方案,以便构建能够尽可能最好地处理大多数场景的实现。

另一个原因是,如果这个 Observable 类的用户(同事)向它传递一个匿名函数然后取消订阅,会发生什么情况。该函数实际上不会被取消订阅,因此不会被清除。我反对孤立数据 :)

也许我应该问的另一个问题是,是否可以测试回调是否是匿名的?我假设不会,但问问也无妨。

最佳答案

存储整个字符串没有错;过早的优化是邪恶的。

然而,这听起来像是一个非常糟糕的主意。
如果有人更改功能,但忘记更改未订阅的副本,代码将被巧妙地破坏,而不会发出任何警告。

相反,如果用户想取消订阅,您可以要求用户将匿名函数存储在变量中。
或者,您可以为每个订阅者传递一个可选名称,然后使用该名称取消订阅。

关于javascript - Javascript 中的匿名函数引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615447/

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