gpt4 book ai didi

javascript - Function.prototype.bind() 总是很慢吗?

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

我正在编写一个开源 javascript 库,并且大量使用 .bind() 方法,因为我认为面向对象的代码看起来更清晰。 (尽管有争议)

示例

A1:

var that = this;

setTimeout(function () {
that.method();
}, 0);

对比

B1:

setTimeout(this.method.bind(this), 0);

或者,更实用的代码部分

A2:

remoteDataSource.getData(function (a, b, c, d) {
obj.dataGetter(a, b, c, d);
})

对比 B2:

remoteDataSource.getData(obj/* or prototype */.dataGetter.bind(obj));

我为旧版浏览器使用了一个非原生的bind,一切都很完美,直到我打开一个jsperf benchmark for bind。 .

看起来使用 bind 的代码慢了 100 倍。现在,在重写我所有的库之前,我有一个问题要问那些熟悉 javascript 引擎的人:

bind 作为一项新功能是否有可能得到优化 很快,还是因为 JavaScript 架构限制没有机会?

最佳答案

首先,固定jsperf http://jsperf.com/bind-vs-emulate/13 .

=您不应在基准测试中重新创建静态函数。这是不现实的,因为在实际代码中,静态函数只创建一次。

您可以看到 var self = this 模式仍然快了大约 60%。但它需要内联函数定义,因为您可以从任何地方进行绑定(bind),因此具有更好的可维护性。


好吧,不,内置的绑定(bind)语义非常复杂。

当我绑定(bind)时,我只想要这个:

function bind(fn, ctx) {
return function bound() {
return fn.apply(ctx, arguments);
};
}

如果我想预先应用参数或使用一些深层构造函数黑魔法,我会想要一个完全不同的函数。我不知道为什么其中的任何一个都包含在绑定(bind)中。

顺便说一句,几乎所有在 ES5 中引入的东西都存在同样的问题,通过强制实现处理一些理论上与实践中的任何人都不相关的边缘情况来惩罚常见情况。下一个语言版本将继续沿着同样的道路前进。

模拟绑定(bind)甚至根本不尝试模拟绑定(bind)。即使你试图模仿它,你也无法做到完全做到这一点是不公平的。

因此,在其他条件相同*的情况下,内置绑定(bind)不会比仅绑定(bind)的常识性自定义绑定(bind)更快。

*在 JIT 中,用户代码与内置代码相比没有明显的劣势。事实上,SM 和 V8 都实现了许多内置函数在 Javascript 中。

关于javascript - Function.prototype.bind() 总是很慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895305/

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