Есть ли проблемы с использованием this.variable в качестве аргумента по умолчанию в Javascript? - PullRequest
5 голосов
/ 15 мая 2019

Если у меня есть класс 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 ]

2 голосов
/ 15 мая 2019

Это технически правильно, но лучше максимально уменьшить область видимости. Чрезмерное использование глобальных (this) переменных может привести к запутанному или трудно читаемому коду, так называемому spaghetti code.

2 голосов
/ 15 мая 2019

Ну, тут не о чем беспокоиться, кроме обычной проблемы js this.Вы можете ввести значения в этот метод, используя метод call, bind и т. Д.Это также может привести к ошибкам и несоответствиям.

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);
}
1 голос
/ 15 мая 2019

По-видимому, параметр по умолчанию оценивается во время вызова , поэтому , это не было связано с .bind (), .call () или .apply(), он всегда будет ссылаться на объект , который вызывается на при использовании в методе

Я не вижу никаких проблем, если только вы не должны расширять Foo и вызывать echo на дочернем объекте, который также имеет bar свойство

1 голос
/ 15 мая 2019

Ну ..

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;
  }
}

Если это то, что вы хотите - это прекрасно.

...