我是一个稍微超过初学者的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
上下文是相同的,并且在两个版本中都保留了它。
是否有理由偏爱另一个?
答案 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
在极少数情况下表现得很晦涩。