繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM