主要关注的是效率。
我正在研究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
中。这对我有用。但它安全吗?它有效吗?如果不是,请建议我一个好的策略/技巧。
谢谢:)
答案 0 :(得分:2)
是的,它是安全的,但您可以使用新的arrow syntax。它会保留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
。
在有效率的情况下,您不需要额外的变量。您不会使用额外的变量污染本地范围。在表演中没有任何影响。