gpt4 book ai didi

javascript - JS参数绑定(bind)不起作用

转载 作者:行者123 更新时间:2023-11-30 12:05:00 25 4
gpt4 key购买 nike

function pubsub(){

var events = {};

var self = this;
self.on = registerEvent;
self.emit = triggerEvent;

function registerEvent(eventName,eventCb){

if(events[eventName] === undefined){
events[eventName] = {
'counter' : 0,
'subscribers': {},
'length' : 0
}
}

var counter = events[eventName].counter++;

events[eventName].subscribers[counter] = eventCb;
events[eventName].length = Object.keys(events[eventName].subscribers).length;

var unsubscribeObj = unsubscribe.bind(eventName,counter);

return {'unsubscribe':unsubscribeObj};

}

function triggerEvent(eventName,param){

if(events[eventName] !== undefined && events[eventName].length){
var eventList = Object.keys(events[eventName].subscribers);
for(var index in eventList){
var eventKey = eventList[index];
events[eventName].subscribers[eventKey].apply({},param);
}
}

}

function unsubscribe(eventName,counter){

if(events[eventName].subscribers[counter] !== undefined){
delete events[eventName].subscribers[counter];
events[eventName].length = Object.keys(events[eventName].subscribers).length;
}else{
console.warn("Event not subscribed");
}
}
}

我正在尝试编写一个 pubsub 程序。一切正常,除了退订功能。

    var unsubscribeObj = unsubscribe.bind(eventName,counter);
return {'unsubscribe':unsubscribeObj};

对于取消订阅,我正在传递抛出绑定(bind)的参数,但是当从外部调用时它不起作用。

var pObj = new pubsub(); // Works Fine
var e1 = pObj.on('event1',function(data){ alert(data); });
pObj.emit('event1',["hi"]);
e1.unsubscribe()

未捕获的类型错误:无法读取未定义的属性“订阅者”

最佳答案

bind 的第一个参数是调用原始函数时用作this 的值;调用它的参数之后。所以行

var unsubscribeObj = unsubscribe.bind(eventName,counter);

创建一个函数,该函数将通过 this 引用 eventNamecounter 作为其第一个 参数来调用。但是您的 unsubscribe 需要 eventName 作为第一个参数,counter 作为第二个 参数。

如果您希望eventNamecounter 参数都是arguments,请将不同的第一个参数传递给bind .如果您不关心 unsubscribe 中的 this 是什么,您通常会选择 null:

var unsubscribeObj = unsubscribe.bind(null, eventName, counter);

关于 bind 的更多信息:spec | MDN

关于javascript - JS参数绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505447/

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