Angular 2+ Переменная подъема? - PullRequest
1 голос
/ 01 марта 2020

Как Angular разрешает все его переменные независимо от того, где они находятся в компоненте?

Например, в Vanilla JS

console.log(a) // undefined
let a = 'Hello;

Angular компонент

ngOnInit(){
this.example()
}

example(){
console.log(this.a) // Hello
}

a = 'Hello'

Я знаю, что это плохая практика, и компилятор будет жаловаться на это размещение переменной, но тем не менее мне любопытно, как Angular достигает этого, или это не Angular специфицирует c поведение?

1 Ответ

1 голос
/ 01 марта 2020

Это не поведение Angular. На самом деле предоставленный вами фрагмент кода находится внутри класса, и a не является переменной, фактически это свойство.

JavaScript (и Typescript) не требует, чтобы свойства были объявлены ранее методы (не конструктор), так как это просто объявление, которое будет использоваться в будущем, когда будет создан экземпляр этого класса.

Хотя tslint может предупредить вас о размещении его после методов, это всего лишь проблема стиля кодирования .

Вы можете перевести класс в традиционный конструктор функций:

class Car {
  make = 'default';

  drive() {
     /* ... */
  }

  model = 'foo'
}

можно записать как (и преобразуется в случае использования некоторого полифилла в браузерах , которые не поддерживают Класс ES6 ):

var Car = function() {
  this.make = 'default';
  this.model = 'foo';
}

Car.prototype.drive = function() {
  /* ... */
}

Обратите внимание, что во втором случае свойства определяются внутри конструктора, поэтому он всегда будет выполняться до вызова метода.

...