в классе es6 ,, чтобы связать это (для обработчика события реакции) ,
использовать bind
так:
class BindFn {
constructor() {
this.fn = this.fn.bind(this);
}
fn() {}
}
или использовать arrow function
следующим образом:
class ArrowFn {
fn = () => {}
}
, поскольку bind реализован следующим образом:
const bind = function(scope) {
const fn = this;
return function(...args) {
return fn.apply(this, args);
};
};
, поэтому при создании нескольких экземпляров использование bind
будет повторно использовать ссылку в прототипе. И использование arrow function
создаст новую функцию без использованияссылка.
И я пишу html для проверки, первое использование BindFn
выполнить десять раз, каждое время записи и максимум jsHeap в производительности Chrome.А потом ArrowFn
.Наконец, я получил это:
use bind: spend time: 527.2 maxHeap: 173.4M
use arrow: spend time: 1081.2 maxHeap: 174.8M
использование памяти аналогично, я думаю, использование bind сильно уменьшится, почему?
мой HTML-код тела:
class BindFn {
constructor() {
this.fn = this.fn.bind(this);
}
fn() {
const str = 'sdffsdfsdf'.repeat(999999);
return str
}
}
class ArrowFn {
fn = () => {
const str = 'sdffsdfsdf'.repeat(999999);
return str;
};
}
const objList = [];
let startTime = new Date();
for (let i = 0; i < 999999; i++) {
// objList.push(new BindFn());
objList.push(new ArrowFn());
}
console.log('spend time:' + (new Date() - startTime));