3

尽管我一直在研究“这个”,但我对遇到的这种编码模式感到有些困惑。以下(简化)代码显示了该模式:

var MyConstructor = function MyConstructor() {
    this._handlers = {
        action: this.handleAction.bind(this)
    };
};

MyConstructor.prototype.start = function(someObj) {
    this.someObj.on(’some event’, this._handlers.action);  //<--here
}

MyConstructor.prototype.handleAction = function() {
    //do stuff
}

module.exports = MyConstructor;

我的问题是,为什么需要构造函数中的私有方法?这种模式是否避免了一些常见问题?评论的行是否可以//<--here简单地是:

this.someObj.on(’some event’, this.handleAction);
4

2 回答 2

3

不,它们是不同的。区别在于context,这意味着this函数内的值。

this.handleAction将函数传递给on没有任何上下文。没有指定的值this。该值将在函数执行时确定。该值很可能不是aMyConstructor对象,因此this.start,例如,它不会引用正确的对象,或者实际上可能根本不会引用任何对象。

解决方案是bind上下文。这将永远设置上下文,因此this将始终引用正确的值。你看到这行代码:

action: this.handleAction.bind(this)

这意味着,当代码稍后引用 时this._handlers.action,它将on使用适当的上下文将函数发送到,因此this将始终指向正确的值。

于 2013-11-13T09:26:38.810 回答
2

以下行之间的区别

this.someObj.on(’some event’, this.handleAction.bind(this));
this.someObj.on(’some event’, this.handleAction);

...是第一个 handleAction 将在 this 作为 MyConstructor 的实例的情况下运行,而第二个将在事件处理机制决定的任何上下文中运行。如果它是这样的,它将以 this 作为全局对象运行:

function on (a, callback) {
  callback(); // callback is run with this as the global object 
              // UNLESS it was bound to something else
}

'private' _handlers 属性只是一个对象,它保存对绑定到实例的回调的引用。如果您要调用 bind 两次,将创建两个函数。_handlers 属性使得它可以创建一个绑定函数,该函数可以用作任意数量事件的处理程序。

于 2013-11-13T09:26:55.560 回答