尝试了解绑定调用函数的效果

Trying to understand effect of binding the call function

提问人:user871199 提问时间:7/13/2023 更新时间:7/13/2023 访问量:32

问:

我遇到了跟随(清理)代码并试图了解到底发生了什么。我通常知道绑定函数接受这个参数,第一个参数充当参数等。另请阅读 mdn 上关于调用/应用方法如何行为的文档。但是,我很难理解以下语法

var eObject = Object,
    DeObject_bind = eObject.bind,
    neObject_call = eObject.call,
    object_call = neObject_call.bind(DeObject_bind, neObject_call),
    reObject_apply = eObject.apply,
    object_apply = object_call(reObject_apply)

这里到底发生了什么?例如,似乎object_call与此集绑定到 Object.bind。这实现了什么?申请也一样 - 到底发生了什么?

javascript 函数 this

评论

1赞 Pointy 7/13/2023
如果您发现此代码没有附带详尽的解释,您可能需要寻找更好的来源。
0赞 user871199 7/13/2023
@Pointy,一些 javascript 代码被故意混淆,并雇用了这里讨论的技术。他们不会在代码中添加注释,但是作为开发人员,我想了解到底发生了什么。
1赞 Pointy 7/13/2023
好吧,它并没有真正混淆;这些是完全可读的函数调用,具有相当清晰的变量和函数名称。问题在于,它正在创建速记绑定函数,这些函数可以做一些学术上有趣的事情,但实际上并没有真正有用。
0赞 Bergi 7/13/2023
开始很奇怪。人们会预料到的eObject = ObjecteObject = Function.prototype
0赞 Pointy 7/13/2023
@Bergi代码只是在寻找 和 的快捷方式。Function.prototype.bindFunction.prototype.call

答:

0赞 Pointy 7/13/2023 #1

首先,我将把这些长变量名称(前两个)缩写为 和 ,因为它们就是这样。bindcall

因此最好写成neObject_call.bind(DeObject_bind, neObject_call)

call.bind(bind, call)

这意味着我们将得到一个绑定函数,该函数将是带有可选额外参数的简写。为什么?好吧,将在调用函数时将函数本身绑定为值,就好像我们在做.通常,要使用 call,您需要一些随机函数并编写 .因此,绑定 to 使 成为 的简写函数。bind.call(call)call.bind(bind)bindthiscallbind.call()fnfn.call(someThis, someValue)callbindbind.call()

因此基本上是object_call(reObject_apply)

bind.call(call, apply)

这调用了 with 作为值,所以它就像bindcallthis

call.bind(apply)

它使 with 作为值的绑定版本。那就像callapplythis

apply.call(...)

这样一来,您就可以调用 “naked” 而不是 ,而是允许您将函数作为第一个参数传递。apply()someFn.apply()

为什么有人会这样做?好吧,拥有这些元函数的版本可能会很有用,这些版本可以很容易地用于诸如 或 之类的事情。.map().reduce()

评论

0赞 Bergi 7/13/2023
如果您想使用并且不相信环境不会搞砸,它也很有用.call().apply()Function.prototype
0赞 Pointy 7/13/2023
是的,我猜是好点