4

我是一个比初学者稍微多一点的 JavaScript。

在阅读EventEmitter的源代码时,我偶然发现了这个有趣且对我来说优雅的函数:

// alias a method while keeping the correct context
function alias(name) {
    return function aliasClosure() {
        return this[name].apply(this, arguments);
    };
}

我有两个主要问题:

第一:为什么是aliasClosure命名函数?除了清晰度之外,它还有其他用途吗?还有,真的是闭包吗?对我来说,它看起来就像一个半匿名函数。

第二:我像这样重写了这个函数:

function alias2(name) {
    return this[name].bind(this);
}

是否等效?我认为应该,因为this上下文是相同的,并且在两个版本中都保留了。

有理由偏爱其中一个吗?

4

2 回答 2

2

不,这些根本不等同。通过查看该alias()功能,我认为您会像这样使用它:

> Array.prototype.strjoin = alias('join');   // make 'strjoin' an alias of 'join'
> [1, 2, 3].strjoin(" + ");
"1 + 2 + 3"

在上面的代码中使用alias2()将不起作用。

于 2013-08-27T22:00:08.977 回答
1

在函数实例化表达式中提供名称可以使名称可用于堆栈跟踪。var(有人告诉我,如果函数是在某些上下文中创建的,比如初始化,那么新的调试器并不总是需要它。)

我认为第二个是等效的,尽管.bind()它处理了一些晦涩的特殊情况。

编辑等待 - 不,它们不相等。第一个this显式涉及,并在每个调用上执行查找。第一个函数在调用时不需要this绑定到任何东西,而在这种情况下你的函数会抛出异常。

使两个函数几乎相等的一项更改是包装bind在闭包中,如下所示:

function alias2(name) {
    return function() {
        return this[name].bind(this);
    }
}

尽管如此,bind在极少数情况下表现得晦涩难懂。

于 2013-08-27T21:48:00.670 回答