JS参数绑定不起作用

时间:2016-02-19 12:31:44

标签: javascript

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()

未捕获的TypeError:无法读取未定义的属性“订阅者”

3 个答案:

答案 0 :(得分:3)

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

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

创建一个函数,使用this调用eventNamecounter作为第一个参数。但是,unsubscribe期望eventName为第一个参数,counter第二个参数。

如果您希望eventNamecounter参数都是参数,请将不同的第一个参数传递给bind。如果您不关心thisunsubscribe的内容,null通常是您选择的内容:

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

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

答案 1 :(得分:0)

您需要在比较之前检查父属性是否存在。

Element

这是因为这个错误:

  

CollectionType.Generator.Element

由于function unsubscribe(eventName,counter){ if(events[eventName] && 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"); } } 未定义而生成,因此Uncaught TypeError: Cannot read property 'subscribers' of undefined不存在。

您可以避免此更改时出现错误。

答案 2 :(得分:0)

如果你想绑定上下文,你应该这样做:

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