[英]Different functions - are they the same?
我是一个略微超过初学者的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
上下文是相同的,并且在两个版本中都保留了它。
是否有理由偏爱另一个?
不,这些根本不相同。 从查看alias()
函数我认为你会使用这样的东西:
> Array.prototype.strjoin = alias('join'); // make 'strjoin' an alias of 'join'
> [1, 2, 3].strjoin(" + ");
"1 + 2 + 3"
在上面的代码中使用alias2()
将不起作用。
在函数实例化表达式中提供名称会使堆栈跟踪的名称可用。 (我告诉新的调试器并不总是需要它,如果在某些上下文中创建函数,比如var
初始化。)
我认为第二个是等效的,但主要是.bind()
有一些它处理的模糊特殊情况。
编辑等待 - 不,他们不等同。 第一个明确涉及this
,并在每次调用时执行查找。 第一个功能并不需要this
绑定到任何东西,当它的名字,而你会在这种情况下抛出异常。
使两个函数几乎相等的一个变化是将bind
包装在一个闭包中,如下所示:
function alias2(name) {
return function() {
return this[name].bind(this);
}
}
但是,在极少数情况下, bind
表现得模糊不清。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.