测试代码:
let obj = { key: 1 };
function func1 () { obj.key = 2;}
let func2 = function () { this.key = 2; }.bind(obj) ;
function test (func) {
for (let i = 0;i < 1000000; i++) func();
}
console.time('func1');
test(func1);
console.timeEnd('func1')
console.time('func2');
test(func2);
console.timeEnd('func2')

我在 chrome 上执行了三次,结果是这样的:
func1: 1.767ms
func2: 12.910ms
func1: 1.849ms
func2: 59.454ms
func1: 1.868ms
func2: 64.076ms
然后我把,fun1 和 fun2代码对调 ,我再执行了三次,结果是这样的:
func2: 57.897ms
func1: 9.906ms
func2: 61.492ms
func1: 9.527ms
func2: 58.168ms
func1: 9.356ms
我把循环扩大100倍,各执行3次,结果是这样的:
func1: 72.744ms
func2: 4635.589ms
func1: 80.379ms
func2: 4278.594ms
func1: 73.979ms
func2: 4300.288ms
可以看出第一种性能好...原因是call,apply,bind这种绑定this的操作非常耗性能...
stack overflow 上列出的原因:为什么 bind() 比 闭包要慢(在 chrome 中慢,改成 nodejs 环境后,闭包性能低于 bind())的原因:
1、bind() 的算法比闭包以及 call() 和 apply() 要复杂;
2、bind() 在 v8 引擎的实现中采用了很多耗性能的函数,
综上, bind() 性能低于闭包,但可读性和可维护性要高出闭包很多。闭包虽然可读性较差,但性能却要比call,apply,bind这种绑定this的操作要好很多。
参考链接:
https://segmentfault.com/q/1010000005987591
http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure
网友评论