Je pose cette question parce que mon collègue et moi avons un différend sur le style de codage car il préfère la déclaration de fonction des flèches:
const sum = (a, b) => a + b;
Et je préfère la déclaration de fonction autonome à l'ancienne:
function sum(a, b) {
return a + b;
}
Mon point est que le code à l'ancienne est plus lisible et que vous pouvez distinguer plus clairement les déclarations de fonctions et de variables. Son point est que le code avec les fonctions fléchées s'exécute plus rapidement.
Savez-vous quelque chose sur les pénalités de performances réelles (dans la v8) lorsque vous utilisez une déclaration de fonction autonome à l'ancienne au lieu des fonctions fléchées? Ces sanctions existent-elles vraiment?
Développeur V8 ici. Les fonctions fléchées ne sont (pour la plupart) que du "sucre syntaxique" pour les déclarations de fonctions conventionnelles. Il n'y a aucune différence de performances.
Ce qui suit montre que:
function goFat() {
for (var i = 0; i < 1000000; i++) {
var v = ()=>{};
v();
}
}
function goTraditional() {
for (var i = 0; i < 1000000; i++) {
var v = function() {};
v();
}
}
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));
console.log('------');
}
<button onclick="race()">RACE!</button>
dans mon exp, j'ai trouvé que les fonctions fléchées fonctionnent plus rapidement que les fonctions JS normales. Voici un petit extrait de react qui utilise la flèche et la fonction normale. J'ai trouvé que le composant utilisant les fonctions fléchées s'exécute un peu plus vite que celui ayant la fonction js normale.
https://codepen.io/lokeshpathrabe/pen/qgzadx
class Fun extends React.Component {
constructor(props){
super(props);
this.state = {start: new Date().getTime(),
end: new Date().getTime(),
number: 0};
console.log('Function start: ', this.state.start);
const fun = function(me){
let n = me.state.number
me.setState({
...me.state, end: new Date().getTime(), number: ++n
})
}
this.interval = setInterval(fun, 1, this);
}
stop(){
clearInterval(this.interval);
}
componentDidUpdate(){
if((this.state.end - this.state.start) > 5000){
console.log('Function end: ', this.state.end);
clearInterval(this.interval)
}
}
render() {
return (
<div>
<h2>Counter with Function {this.state.number}</h2>
</div>
)
}
}
class Arrow extends React.Component {
constructor(props){
super(props);
this.state = {start: new Date().getTime(),
end: new Date().getTime(),
number: 0};
console.log('Arrow start: ', this.state.start);
this.interval = setInterval(()=>{
let n = this.state.number
this.setState({
...this.state, end: new Date().getTime(), number: ++n
})
}, 1);
}
stop(){
clearInterval(this.interval);
}
componentDidUpdate(){
if((this.state.end - this.state.start) > 5000){
console.log('Arrow end: ', this.state.end);
clearInterval(this.interval)
}
}
render() {
return (
<div>
<h2>Counter with Arrow {this.state.number}</h2>
</div>
)
}
}
class HOC extends React.Component {
render() {
return (<div>
<h1>The one reaching higher count wins</h1>
<Arrow/>
<Fun/>
</div>);
}
}
ReactDOM.render(<HOC />, document.getElementById('react-content'))
Faites-moi savoir si votre opinion diffère