不同的功能 - 它们是一样的吗?

时间:2013-08-27 21:44:58

标签: javascript functional-programming

我是一个稍微超过初学者的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上下文是相同的,并且在两个版本中都保留了它。

是否有理由偏爱另一个?

2 个答案:

答案 0 :(得分:2)

不,这些根本不相同。通过查看alias()函数,我认为您会使用类似这样的函数:

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

在上面的代码中使用alias2()将无效。

答案 1 :(得分:1)

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

我认为第二个是等效的,但主要是.bind()有一些不明确的特殊情况。

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

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

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

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