測(cè)試代碼:
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 上執(zhí)行了三次懂缕,結(jié)果是這樣的:
func1: 1.767ms
func2: 12.910ms
func1: 1.849ms
func2: 59.454ms
func1: 1.868ms
func2: 64.076ms
然后我把,fun1 和 fun2代碼對(duì)調(diào) 封锉,我再執(zhí)行了三次磕瓷,結(jié)果是這樣的:
func2: 57.897ms
func1: 9.906ms
func2: 61.492ms
func1: 9.527ms
func2: 58.168ms
func1: 9.356ms
我把循環(huán)擴(kuò)大100倍,各執(zhí)行3次沿猜,結(jié)果是這樣的:
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 環(huán)境后,閉包性能低于 bind())的原因:
1啼肩、bind() 的算法比閉包以及 call() 和 apply() 要復(fù)雜橄妆;
2、bind() 在 v8 引擎的實(shí)現(xiàn)中采用了很多耗性能的函數(shù)祈坠,
綜上害碾, bind() 性能低于閉包,但可讀性和可維護(hù)性要高出閉包很多赦拘。閉包雖然可讀性較差慌随,但性能卻要比call,apply,bind這種綁定this的操作要好很多。
參考鏈接:
https://segmentfault.com/q/1010000005987591
http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure