Какой эффективный обходной путь для использования этого внутри анонимной функции?
Главное беспокойство - эффективность.
Я работаю над областями JavaScript, и одна вещь, которая меня смущает, это this
внутри функции.
Я прочитал много ответов и понимаю их. Но меня беспокоит эффективность. Посмотрите на мой код.
class Fancy {
constructor () {
}
checkScope (callback) {
console.log('Inside checkScope');
callback ();
}
}
class Prog {
constructor () {
this.name = 'myProg';
this.fancy = new Fancy ();
}
run () {
var that = this;
this.fancy.checkScope(function () {
console.log('Name ', that.name);
});
}
}
var prog = new Prog ();
prog.run();
Сейчас в run()
Я храню ссылку на this
в локальной переменной that
, Это работает для меня. Но безопасно ли это? Это эффективно? Если нет, предложите мне хорошую стратегию / трюк.
Спасибо:)
1 ответ
Да, это безопасно, но вы можете использовать новый синтаксис стрелки. this
,
class Fancy {
constructor () {
}
checkScope (callback) {
console.log('Inside checkScope');
callback ();
}
}
class Prog {
constructor () {
this.name = 'myProg';
this.fancy = new Fancy ();
}
run () {
// Here your don't need var that = this,
// because the arrow function gets the same this
this.fancy.checkScope( () => {
console.log('Name ', this.name);
});
}
}
var prog = new Prog ();
prog.run();
Каждая простая функция имеет this
в твоем случае твой
function () {
console.log('Name ', this.name); // this is undefined in 'strict mode'
}
имеет свой this
. Так что вам нужно сохранить this
вне функции и использовать с псевдонимом в функции. В ES6
есть новый arrow syntax function
, Arrow functions
не отменяйте this
, В твоем случае
run () {
this.fancy.checkScope( () => {
console.log('Name ', this.name);
});
}
this
в run function
и в parameter function
подобные. Это означает, что в arrow function scope
this
относится к этому this
в котором arrow function
был определен.
В случае эффективности вам не нужна дополнительная переменная. Вы не загрязняете локальную область видимости дополнительной переменной. На исполнение это никак не влияет.