是箭头函数比绑定方法更快通过此参数

问题描述:

我一直在ES6一段时间的实验现在和我有一个问题关于方法.bind(this)与新的箭头函数相比的性能。是箭头函数比绑定方法更快通过此参数

我想知道在使用.bind(this)传统功能方面是否有任何性能改进,或者是否对用户箭头功能以及为什么更好。

我做了下面的测试,但我不确定为什么每次执行测试时都会得到不同的值。

function useBind() { 
    if(this && this.i) { 
     console.log(this.i); 
    } 
} 

const noBind =() => { 
    if(this && this.i) { 
     console.log(this.i); 
    } 
} 

function goFat() { 
    this.i = 10; 
    for (var i = 0; i < 100; i++) { 
     noBind(); 
    } 
} 

function goTraditional() { 
    this.i = 20; 
    for (var i = 0; i < 100; i++) { 
     useBind.bind(this)(); 
    } 

} 

function race() { 
    var start = performance.now(); 
    goTraditional(); 
    console.log('Traditional elapsed: ' + (performance.now() - start)); 
    start = performance.now(); 
    goFat() 
    console.log('Fat elapsed: ' + (performance.now() - start)); 

    start = performance.now(); 
    goTraditional(); 
    console.log('Traditional elapsed: ' + (performance.now() - start)); 
    start = performance.now(); 
    goFat() 
    console.log('Fat elapsed: ' + (performance.now() - start)); 

    start = performance.now(); 
    goTraditional(); 
    console.log('Traditional elapsed: ' + (performance.now() - start)); 
    start = performance.now(); 
    goFat() 
    console.log('Fat elapsed: ' + (performance.now() - start)); 
    console.log('------'); 
} 

对不起,如果这个问题是重复或有其他类似的话题,但我不能找到一个具体的答案,直到现在。

+3

'useBind.bind(this); useBind();' - 这不是''bind'如何工作。 – Bergi

+0

你试图做的事是什么,是如此的性能关键? –

+1

您是否关心调用的性能或创建函数对象的性能? – Bergi

由于您的运行时间由console.log()的调用支配,因此您会得到不同的结果。如果你在内循环中做了如console.log()这样的强化,你调用它们的方式不会影响你的运行时间。

一般来说,你不应该关心微观优化,直到你知道你需要它为止。使用适合情况的风格。如果您可以使用箭头功能,请使用它们。与bind相反,它们避免了创建新的函数对象。

如果您想实际调用绑定函数(而不是useBind.bind(this); useBind()),那么您的测试必须重写useBind.bind(this)()。如果你关心性能,你可以在循环之外进行绑定。除非你想测量创建绑定函数的影响。