gpt4 book ai didi

javascript - 绑定(bind)函数而不是闭包来注入(inject)额外的参数

转载 作者:行者123 更新时间:2023-11-29 14:51:01 25 4
gpt4 key购买 nike

好像不是

{  onClick: function(event){  someHandler('clicked', event); }  }

你可以写

{  onClick: someHandler.bind(null, 'clicked'); }

看起来更简洁,感觉更“实用”。

这样做有什么缺点吗?不创建闭包是否会提高性能?有没有办法保留闭包收到的 this

最佳答案

这不是“闭包”,它只是一个匿名函数。

我个人更喜欢bind 版本,因为如您所说,它更简洁。然而,根据这个 jsperf ( http://jsperf.com/anonymous-function-vs-bind ),它慢了十倍,这让我非常惊讶,特别是因为这里使用的 bind 似乎是原生的。一种假设是 bind,或者更确切地说,它生成的函数需要围绕查看传入的参数并构建参数列表以传递给被调用的函数。

为了维护this,你需要一个bind的变体,比如Underscore的_.partial,或者你可以自己写一个:

function partial(fn) {
var slice = Array.prototype.slice,
args = slice.call(arguments, 1);
return function() {
return fn.apply(this, args.concat(slice.call(arguments, 1)));
};
}

不幸的是,使用 partial ({ onClick: partial(someHandler, 'clicked'); }) 的变体仍然比匿名函数慢十倍。

jsperf 中的另一个测试用例支持参数列表处理导致速度减慢的假设,它定义了一个 partial1,它仅预定义了底层函数的两个参数中的第一个:

function partial1(fn, a) {
return function(b) {
return fn.call(this, a, b);
};
}

使用不需要创建和合并参数列表的那个,导致速度降低 25-35%,而不是 90%。

如果我们不关心通过 this 传递,这允许我们避免使用 Function#call:

function partial2(fn, a) {
return function(b) {
return fn(a, b);
};
}

那么减速只有 10%。

但是,如果我们真的要通过this,那么我们需要把匿名函数版本写成

{ onClick: function(event) { someHandler.call(this, 'clicked', event); }  }

这也导致原始版本的速度降低 20-25%,这可能是由于调用 Function#call 的成本所致。所以从这个意义上说,假设你确实想要通过this,匿名函数的性能和我们自己开发的partial1,为参数的数量大致相等,这并不奇怪,因为它们本质上是在做相同的工作。

关于javascript - 绑定(bind)函数而不是闭包来注入(inject)额外的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25778841/

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