如果我有ES6类,例如:
class Foo {
constructor(bar) {
this.bar = bar;
}
echo(value=this.bar) {
return value;
}
}
this.bar
应该在每次调用echo
时重新评估。
f = new Foo(10);
f.echo();
>> 10
f.bar = 99;
f.echo();
>> 99
此用法是否有潜在的问题?
答案 0 :(得分:2)
从技术上讲这是正确的,但最好尽可能缩小范围。过度使用全局变量(this)可能会导致代码混乱或难以阅读,也称为spaghetti code
。
答案 1 :(得分:2)
除了通常的js this
问题外,没有什么可担心的。
您可以使用调用,绑定等方法将值注入此方法。
这也可能导致错误和不一致。
class Foo {
constructor(bar) {
this.bar = bar;
}
echo(value=this.bar) {
return value;
}
}
f = new Foo(10);
console.log('f', f.echo().toFixed(0))
console.log('f', f.echo.call({bar: 50}).toFixed(0))
try{
console.log('f', f.echo.call(window).toFixed(0))
}catch(e){
console.error(e);
}
class Fooo {
constructor(bar) {
this.bar = bar;
// fixing the scope
this.echo = (value=this.bar) => {
return value;
}
}
}
f2 = new Fooo(10);
console.log('f2', f2.echo().toFixed(0))
console.log('f2', f2.echo.call({bar: 50}).toFixed(0))
try{
console.log('f2', f2.echo.call(window).toFixed(0))
}catch(e){
console.error(e);
}
答案 2 :(得分:1)
好吧。
如果注释中指出echo(value=this.bar)
,则 value
会将this.bar
设置为value === undefined
。因此,您正在这样做:value = value === undefined ? this.bar : value;
基本上和做的一样:
class Foo {
constructor(bar) {
this.bar = bar;
}
echo(value) {
let value = value === undefined ? this.bar : value;
return value;
}
}
如果这就是您想要的-很好。
答案 3 :(得分:1)
它似乎是default param is evaluated at call time,因此只要 this 未被.bind()、. call()或.apply()绑定,它将始终引用在方法中使用时object it's called on
除非您扩展Foo
并在具有echo
属性的子对象上调用bar
,否则我看不到任何问题