提问人:user871199 提问时间:7/13/2023 更新时间:7/13/2023 访问量:32
尝试了解绑定调用函数的效果
Trying to understand effect of binding the call function
问:
我遇到了跟随(清理)代码并试图了解到底发生了什么。我通常知道绑定函数接受这个参数,第一个参数充当参数等。另请阅读 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。这实现了什么?申请也一样 - 到底发生了什么?
答:
首先,我将把这些长变量名称(前两个)缩写为 和 ,因为它们就是这样。bind
call
因此最好写成neObject_call.bind(DeObject_bind, neObject_call)
call.bind(bind, call)
这意味着我们将得到一个绑定函数,该函数将是带有可选额外参数的简写。为什么?好吧,将在调用函数时将函数本身绑定为值,就好像我们在做.通常,要使用 call,您需要一些随机函数并编写 .因此,绑定 to 使 成为 的简写函数。bind.call(call)
call.bind(bind)
bind
this
call
bind.call()
fn
fn.call(someThis, someValue)
call
bind
bind.call()
因此基本上是object_call(reObject_apply)
bind.call(call, apply)
这调用了 with 作为值,所以它就像bind
call
this
call.bind(apply)
它使 with 作为值的绑定版本。那就像call
apply
this
apply.call(...)
这样一来,您就可以调用 “naked” 而不是 ,而是允许您将函数作为第一个参数传递。apply()
someFn.apply()
为什么有人会这样做?好吧,拥有这些元函数的版本可能会很有用,这些版本可以很容易地用于诸如 或 之类的事情。.map()
.reduce()
评论
.call()
.apply()
Function.prototype
评论
eObject = Object
eObject = Function.prototype
Function.prototype.bind
Function.prototype.call