解释bindbind()函数。

6
有人能解释一下这个函数吗?
var bindbind = Function.prototype.bind.bind(Function.prototype.bind);

我理解它所产生的结果:
var bindedContextFunc = bindbind(function)(context);
bindedContextFunc(args);

但是不理解创建这些函数的过程,我的意思是部分bind(Function.prototype.bind)


建议将“context”更改为“thisValue”或类似的名称。 - RobG
@RobG:"context (上下文)"有什么问题吗?我经常看到它被使用,并且我认为它比技术术语更具描述性。你可以给我(我们)一个链接来阅读吗? - Bergi
在ECMAScript中,“上下文”是指执行上下文,它包括当前正在执行的代码的所有参数和作用域。它包括一个this值,并且由代码编写方式控制。它是静态的。相比之下,函数的this值是动态的,并完全由函数的调用方式设置,与函数的声明或初始化无关。因此称呼“this”为上下文是不恰当的。那些这样做的人需要阅读并理解他们正在使用的语言的规范。 - RobG
@RobG 很有趣的信息,谢谢。然而在更高的层面上(不知道行为细节的情况下),this 看起来就像是“上下文”。 - Nik
1个回答

4

好的,这里有三次Function.prototype.bind函数,其(简化后)的代码如下

function bind(context) {
    var fn = this;
    return function() {
        return fn.apply(context, arguments);
    }
}

我会采用更多的部分应用程序,以更加功能化的样式进行缩写:bindfn(context) -> fncontext

那么它是做什么的呢?你有 bind.call(bind, bind) 或 bindbind(bind)。让我们将其扩展到 bindbind。如果我们现在向其提供一些参数会怎样呢?

bindbind(bind) (fn) (context)

bindbind(fn) (context)

bindfn(context)

fncontext

在这里。我们可以将其赋值给一些变量,以使结果更清晰:

bindbind = bindbind(bind)

bindfn = bindbindanything(fn) // bindfn

contextbindfn = bindfnanything(context) // fncontext

result = contextbindfnanything(args) // fncontext(args)


你能详细说明为什么这个解决方案更好(或者我应该问为什么它存在),如果我们可以只使用 fn.bind(context)(args) 来实现相同的结果吗? - Nik
1
假设您有一个API,它想要返回bindfn - 它还不知道上下文。那么您可以使用Function.prototype.bind.bind(fn) - 这很冗长 - 或者只是bindbind(fn)。不确定是否有真实世界的应用。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接