gpt4 book ai didi

javascript - 在 JavaScript 中绑定(bind)/应用构造函数

转载 作者:可可西里 更新时间:2023-11-01 02:29:33 25 4
gpt4 key购买 nike

我一直在寻找使用任意数量的参数调用 Javascript 构造函数的解决方案,并找到了一些不错的 SO 帖子,这让我相信这三个调用应该是一样的。但是,至少在 rhino 和 node.js 中,它们不会:

1. f = Date.bind(Date, 2000,0,1)
2. g = Date.bind.call(Date, 2000, 0, 1)
3. h = Date.bind.apply(Date, [2000, 0, 1])

第一个有预期的结果:

print(new f()) //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)

但是另外两个没有:

print(new g()) //=> Thu Feb 01 1900 00:00:00 GMT-0500 (EST)
print(new h()) //=> Wed Jun 01 1904 00:00:00 GMT-0400 (EST)

所以某处出了问题。想什么?将 applybind 和/或 callnew 混合使用是不是一个坏主意?

最佳答案

previously accepted answer是不正确的。您可以使用构造函数绑定(bind)、调用和应用来创建新的构造函数——测试中的唯一问题是您忘记了 bind.apply 和 bind.call 正在应用和调用 bind ,而不是构造函数本身,所以你给出了错误的参数。

f = Date.bind(null, 2000,0,1)
g = Function.bind.call(Date, null, 2000, 0, 1)
h = Function.bind.apply(Date, [ null, 2000, 0, 1 ])

new f() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
new g() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
new h() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)

这三个都是instanceof日期。

调用的参数是执行上下文,后跟要应用的参数。Apply 的参数是执行上下文和参数数组。Bind 的参数是执行上下文,后跟要绑定(bind)的参数。

因此,例如,要应用的参数是要应用 绑定(bind)(日期)的上下文,后跟一个数组,该数组是参数for 绑定(bind)(因此第一个数组成员是绑定(bind)的上下文参数)。这就是为什么调用或应用绑定(bind)会令人困惑的原因;为两者提供上下文参数感觉很奇怪。

请注意,在将 bind 与构造函数一起使用时,上下文参数始终会被忽略,因为“new”显式创建了一个新的上下文。当上下文参数与保持清晰无关时,我使用 null,但它可以是任何内容。

同时,这些示例中的应用和调用确实需要知道它们应用/调用绑定(bind)的上下文是 Date 函数。我尽可能将“日期”切换为“功能”,以帮助阐明实际提供上下文的内容。当我们调用 apply 或调用 Date.bind 时,我们实际上是在调用 apply 或调用未附加到 Date 对象的 bind 方法。这种情况下的绑定(bind)方法可能来自任何函数。它可以是 Number.bind.call(Date, null, 2000, 0, 1),结果将完全相同。

如果原因不明显,请考虑以下示例之间的区别:

context.method();

var noLongerAMethod = context.method;
noLongerAMethod();

在第二种情况下,该方法已脱离其原始上下文(...除非它之前已绑定(bind))并且如果它在内部依赖“this”,则行为会有所不同。当我们将任何给定函数作为属性绑定(bind),而不是直接执行它时,它只是指向 Function.prototype 上通用绑定(bind)方法的另一个指针。

我个人认为我从来不需要调用或应用绑定(bind),而且很难想象它会是一个好的解决方案的情况,但绑定(bind)构造函数以创建新的构造函数是我发现的非常重要的事情有时有用。无论如何,这是一个有趣的谜题。

关于javascript - 在 JavaScript 中绑定(bind)/应用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10594957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com