Я использую библиотеку babylonjs и создал класс «Building» с машинописным текстом. Используя машинопись для всего, BTW. Я создаю это новое «здание» из своего основного класса game.ts «Game» и при попытке получить доступ к члену «Building», я получаю «неопределенные» переменные ошибки. Однако это происходит только в другом методе класса, но, похоже, работает корректно в конструкторе. Я предполагаю, что это имеет какое-то отношение к «этому» определению в javascript/машинописном тексте. Я попытался модифицировать функцию, выполнив:typescript класс не может найти «эту» переменную?
Create = ...(...)=> {
...
Я попытался создать переменную с помощью:
private rect: =() => Rectangle
, но это по-прежнему не работает
Является ли это действительно проблема с «этим» поскольку ничего не работает. Ниже я точно обозначил, где эта переменная работает и где это не работает.
class Building {
private rect : Rectangle
private buildingMesh:string[]
private buildingId:string
constructor(rect: Rectangle, id:string) {
this.rect = rect
console.log("TL in b const: " + this.rect.topLeft.x) // <--- This works here
this.buildingId = id
}
Create(scene:BABYLON.Scene) {
BABYLON.SceneLoader.ImportMesh(this.buildingId, "models/","tree.babylon", scene, function (newMeshes) {
var idx = 0
console.log("TL in b: " + this.rect.topLeft.x) // <--- this gives me undefined
var wall =newMeshes[0].createInstance(this.buildingId + idx)
wall.position.x = this.rect.topLeft.x
wall.position.y = this.rect.topLeft.y
this.buildingMesh.push(this.buildingId + idx)
idx++
});
}
}
я вижу .. так я думаю, когда вы создаете анонимную функцию, которую он не знает, какое «это» использовать. Документ или класс? Здесь я на правильном пути? Попытка объяснить это, поэтому, если кто-то посмотрит это, они поймут, почему это сработало. Спасибо за помощь, хотя это сработало. Я буду отмечать его как фиксированный. – efel
@efel Если вы создаете простую анонимную функцию, контекст (это ключевое слово this) всегда будет глобальной областью (обычно в браузерах глобальная область видимости является объектом 'window'). Когда вы используете функцию стрелки, контекст будет всегда тем же самым контекстом, что и вы, поэтому, если вы находитесь внутри метода класса, контекст будет объектом (экземпляр этого класса), а функция стрелки контекст будет таким же. Раньше, когда не было функции стрелки, обходной путь состоял в том, чтобы создать локальную переменную для ~ сохранения ~ контекста, а затем использовать ее внутри анонимной функции. – Buzinas
То, как я буду использовать, чтобы объяснить это - TS-компилятор будет создавать 'var _this = this;', а затем использовать его внутри созданной функции стрелки '=>'. Итак, что было ** это ** снаружи, теперь это внутри ... Узнайте больше о функциях стрелок ... чтобы сделать это действительно ясно;) –