Почему я не могу объявить переменную внутри класса ES6, используя ключевое слово let, const или var, но я могу объявить ее напрямую? - PullRequest
0 голосов
/ 17 января 2020

Для следующего кода я хотел бы узнать причину такого поведения в классе ES6:

class One {
    //why the following code is not allowed.
    let check = false; 
    const PI = 3.14;   
    var v = 'Hello';    

    //why the following code is allowed.
    chk = false;       
    Pi = 3.14;         
    vv = "Hi";         
}

Я знаю, что могу написать код, как показано ниже, но я хотел знать реальную причину этого кода .

class Sample {
   constructor(x, y) {
      this.x= x;
      this.y= y;
   }
} 

Ответы [ 2 ]

2 голосов
/ 17 января 2020
class One {
    //why the following code is not allowed.
    let check = false; 
    const PI = 3.14;   
    var v = 'Hello';    

    //why the following code is allowed.
    chk = false;       
    Pi = 3.14;         
    vv = "Hi";         
}

На самом деле, ни один из них не является законным javascript в настоящее время. Последний является примером полей класса, который в настоящее время является предложением этапа 3 , так что в конечном итоге это будет допустимый синтаксис. С транспортером вы можете использовать этот синтаксис прямо сейчас, и транспортер переместит код в конструктор.

class One {
  chk = false;       
  Pi = 3.14;         
  vv = "Hi";         
}

Становится примерно:

class One {
  constructor() {
    this.chk = false;       
    this.Pi = 3.14;         
    this.vv = "Hi";         
  }
}
0 голосов
/ 17 января 2020

Тривиальный ответ: «потому что таков синтаксис class (в настоящее время) определен» (*) они просто отбрасывают ключевое слово «function»), вы не можете помещать исполняемые операторы вне методов (за исключением предложенных publi c и приватных полей , но они еще не в ECMA-262) Например,

class Foo {

  // shorthand function declaration of mandatory constructor method
  constructor (...) {
    // Usual function syntax in here
  }

  // shorthand function declaration of class method
  blah (...) {
    // Usual function syntax in here
  }

  // shorthand function declaration of static method
  static bar (...) {  
    // Usual function syntax in here
  }

  // etc.
}

Существуют способы реализации закрытых членов (JavaScript - объяснение закрытых членов? ), но я думаю, что это выходит за рамки синтаксиса класса.

...