測試代碼:
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