如何比较用`.bind()`调用的两个函数?

Pet*_*oes 6 javascript

我正在我的Socket.IO事件和我的应用程序的其余部分之间构建一个中间件层.我这样做是为了让我可以在将来换掉Socket.IO.

我将回调函数存储在一个数组中.当特定事件触发时,我遍历数组并执行回调函数.这就像一个魅力.

问题在于从该数组中删除回调.当需要删除回调函数时,我遍历数组并检查每个数组项以查看它是否===与我想要删除的回调相等(使用).当回调存储在数组中时,这很好.但是,当回调与组合存储时.bind(),等号检查返回false.

我创建了一个(简化的)codepen来演示这个问题:http://codepen.io/petergoes/pen/wWPJdg?edit = 0012 .

我从Socket.IO代码中汲取灵感来编写我的删除方法:https://github.com/socketio/socket.io-client/blob/master/socket.io.js#L1623.但是,出现同样的问题.

最大的问题是:
如何使用该.bind()方法调用两个函数(一个或两个)?

我找到了这个答案如何在javascript中比较2个函数.但是,比较一个函数的字符串版本感觉有点粗略

codepen供参考:

var callbackList = [];

var objA = {
    myCallbackFunction: function myCallbackFunction() {
        console.log('hello my name is:', this.myName);
    }
}

var objB = {
    register: function register(callback) {
        console.log('register callback');
        callbackList.push(callback);
    },

    remove: function remove(callback) {
        console.log('remove callback');
        if(callbackList[0] === callback) {
            console.log('callback found, splice it');
            callbackList.splice(0, 1);
        } else {
            console.log('callback NOT found!');
        }
        console.log('callbackList length:', callbackList.length);
    }
}

objB.register(objA.myCallbackFunction.bind({myName: 'Peter'}));
objB.remove(objA.myCallbackFunction.bind({myName: 'Peter'}));

console.log('\nreset callbackList\n');
callbackList = [];

objB.register(objA.myCallbackFunction);
objB.remove(objA.myCallbackFunction);
Run Code Online (Sandbox Code Playgroud)

Pab*_*123 1

我认为最好的解决方案是将密钥与数组内的回调一起存储。这比任何比较函数的解决方案都要可靠得多,也更简单:

register: function register(callback, key) {
        console.log('register callback');
        var obj = {
           key: key,
           callback: callback
        }
        callbackList.push(obj);
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过传递所需的键而不是回调来调用删除,并且您可以这样进行比较:

if(callbackList[0].key === key)
Run Code Online (Sandbox Code Playgroud)

只需确保在注册时传递所需的密钥,并在必要时访问数组对象中的回调属性。

我认为这个使用标签的解决方案更加干净,不需要任何令人困惑或奇怪的代码。