Если я создам класс с именем Circle:
class Circle{
constructor(){
this.cost = this.calculateCost()
}
showCosts(){
console.info(l.findHeight(100));
}
calculateCost(){
console.info(l.findHeight(100));
}
}
и есть два метода, которые пытаются получить доступ к переменной с именем l, метод calculateCost не работает (он говорит, что не может findHeight of undefined), потому что он получает доступ из конструктора. Но когда я звоню
l.showCosts()
вне класса это называется нормально. Почему это? и как я могу это исправить?
let l = new Line();
class Line{
findHeight(x){
return x;
}
}
Вам необходимо использовать this. перед переменными класса в JavaScript - например, self в Python и в отличие от C++, Java и C#, которые имеют неявный this.
Кроме того, всем пользователям, голосующим против - пожалуйста, рассмотрите возможность закрытого голосования вместо этого, чтобы OP мог улучшиться, а не голосовать против, что статистически не помогает и просто препятствует OP.
@AbidHasan - За исключением того, что для этого объекта нет метода .findHeight(). Не могу точно сказать, что OP пытается здесь сделать. Одного перехода на this будет недостаточно. OP должен показать весь соответствующий код и лучше описать проблему. Мы ничего не можем поделать с тем, что здесь, так как это неполный вопрос. Голосование за закрытие «непонятно, о чем они спрашивают».
@ jfriend00 Это явно плохо извлеченный код - даже l не определен!
@ jfriend00 Но если он / она говорит, что l.showCosts () работает вне класса, тогда, очевидно, класс должен иметь findHeight, определенный в нем где-то, только не здесь
@AbidHasan - Вы делаете дикие догадки, основываясь на неполной информации. Возможно, l - это совсем другой тип объекта. Кто знает? Дело в том, что этот вопрос заслуживает того, чтобы его закрыть в том виде, в котором он стоит сейчас, потому что он неполный и не описывает или не показывает достаточно, чтобы на него можно было ответить.
Вы действительно пытаетесь определить lпередclass Line?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это происходит потому, что переменная l не определена в той области, в которой она используется (файл, в котором был определен класс Circle). Даже если бы он был определен, он, скорее всего, не сработал бы так, как ожидалось - может быть несколько экземпляров Circle, и они ссылаются на текущую переменную l.
Эта проблема решается с помощью шаблона внедрение зависимости.
Класс можно отредактировать для использования конкретного l:
class Circle{
constructor(l){
this.l = l;
this.cost = this.calculateCost()
}
showCosts(){
console.info(this.l.findHeight(100));
}
calculateCost(){
console.info(this.l.findHeight(100));
}
}
...
let l = new Line();
let circle = new Circle(l);
l- это ваш экземпляр класса. Используйтеthis.findHeightв методеcalculateCost(), и он должен работать