gpt4 book ai didi

javascript - 函数.prototype.bind

转载 作者:行者123 更新时间:2023-12-01 11:41:19 24 4
gpt4 key购买 nike

我有一个关于 EcmaScript-5 Function.prototype.bind 实现的非常有趣的问题。通常当你使用 bind 时,你会这样做:

var myFunction = function() {
alert(this);
}.bind(123);

// will alert 123
myFunction();

好的,这很酷,但是当我们这样做时会发生什么?
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();

我知道就 Function.prototype.bind 的实现方式( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind )而言,这是完全合乎逻辑的行为。但在现实生活条件下,这完全是无用的行为,不是吗?问题是:它是错误还是功能?如果它是一个错误,为什么没有提到它?如果它是一项功能,为什么具有 native “绑定(bind)”实现的 Google Chrome 的行为方式完全相同?

为了更清楚,我认为更有意义的是,这里是实现 Function.prototype.bind 的代码片段有点不同:
if (!Function.prototype.bind) {
Function.prototype.bind = function() {
var funcObj = this;
var original = funcObj;
var extraArgs = Array.prototype.slice.call(arguments);
var thisObj = extraArgs.shift();
var func = function() {
var thatObj = thisObj;
return original.apply(thatObj, extraArgs.concat(
Array.prototype.slice.call(
arguments, extraArgs.length
)
));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(funcObj, args);
}
return func;
};
}

所以现在试试这个:
// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();

在我看来,替换“this”更有意义......

那么你们怎么看呢?

最佳答案

Function.prototype.bind 的先例是这个想法在各种 JS 框架中的实现。据我所知,他们都不允许this -绑定(bind)由后续绑定(bind)更改。你可能会问为什么没有一个允许 this-binding 更改,就像问为什么 ES5 不允许它一样。

你不是我听说的唯一一个认为这很奇怪的人。负责 Mozilla JS 引擎的 Chris Leary(和我一样)认为这有点奇怪,几个月前在 Twitter 上提出了这个问题。并且以某种不同的形式,我记得 Mozilla 实验室的一个黑客质疑是否有某种方法可以“取消绑定(bind)”一个函数,以从中提取目标函数。 (如果你能做到这一点,你当然可以将它绑定(bind)到不同的 this ,至少如果你还可以提取绑定(bind)的参数列表来传递它。)

我不记得 bind 时讨论的问题。被指定。然而,当这些东西被散列出来时,我并没有特别关注 es-discuss 邮件列表。也就是说,我认为 ES5 并没有在该领域进行太多创新,借用一句话来说,只是“铺平道路”。

如果你写了一个足够详细的提案,你也许可以提出一些内省(introspection)的方法来解决这些问题。另一方面,绑定(bind)是一种信息隐藏机制,会阻碍其采用。如果您有时间,可能值得尝试提出一些建议。我的猜测是信息隐藏问题会阻止提案被采纳。但这只是一种猜测,很可能是错误的。只有一种方法可以找出...

关于javascript - 函数.prototype.bind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282158/

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