在Java中使用this.variable作为参数默认值是否有问题?

时间:2019-05-15 20:02:15

标签: javascript es6-class

如果我有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

此用法是否有潜在的问题?

4 个答案:

答案 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,否则我看不到任何问题