Относятся ли переменные, на которые ссылаются без использования ключевого слова this в классе Javascript, к глобальным переменным?

#javascript #node.js #this #es6-class

Вопрос:

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

 const read = require('readline-sync')
let flag = 1

class operations {
    
    constructor(num1, num2) {
        this.num1 = num1
        this.num2 = num2
    }

    addition() {
        let sum = num1   num2
        console.log(num1   "   "   num2   " = "   sum)
    }
    subtraction() {
        let diff = num1 - num2
        console.log(num1   " - "   num2   " = "   diff)
    }
    multiplication() {
        let prod = num1 * num2
        console.log(num1   " x "   num2   " = "   prod)
    }
    division() {
        let quotient = num1 / num2
        console.log(num1   " / "   num2   " = "   quotient)
    }

}

do {
    console.log("Enter two numbers ")
    num1 = read.questionInt()
    num2 = read.questionInt()
    let opvar = new operations(num1, num2)
    console.log("Enter your choice of operationn1.Additionn2.Subtractionn3.Multiplicationn4.Division")
    let choice = read.questionInt()
    switch (choice) {
        case 1:
            opvar.addition()
            break
        case 2:
            opvar.subtraction()
            break
        case 3:
            opvar.multiplication()
            break
        case 4:
            opvar.division()
            break
        default:
            console.log("Invalid Entry")
    }

    flag = read.questionInt("Press 1 to continue and 0 to exit ")
}
while (flag === 1)
 

Но как это работало без моего использования ключевого слова «this» внутри методов класса? Итак, если я не использую ключевое слово «this», будут ли методы класса/объекта обращаться к глобальной переменной с тем же именем?
Я новичок, поэтому заранее приношу извинения, если это глупый вопрос.

Комментарии:

1. Если они не были определены локально,т. Е. внутри функции, то да, они будут просматриваться в цепочке областей, пока она не достигнет глобальной области. И вы устанавливаете глобальные переменные своими num1 = read.questionInt() строками в своем do...while цикле

2. Когда функция вызывается с ключевым словом new, функция является функцией-конструктором и возвращает новый экземпляр. В этих случаях «это» относится к вновь созданному экземпляру.

3. Пожалуйста, пожалуйста, запустите свой код в строгом режиме, и тогда это accidental назначение глобалам будет помечено как ошибка программирования (как и должно быть), и тогда такого рода вещи случайно не произойдут. Будет сообщено об ошибке, и вам придется исправить код, чтобы он был правильным. strict режим — ваш друг.

4. @питер, Но мы не можем использовать «var», » let » или «const» внутри конструктора или вне метода в классах javascript, не так ли? Но мы можем использовать эти методы внутри класса. Это немного странно

5. num1 = read.questionInt() <— ну, вы, вероятно, получили бы другие результаты, если бы вы на самом деле объявили, что num1 есть и num2

Ответ №1:

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

Например, ниже приведен класс, созданный в глобальной области. val , внутри print() функции, относится к глобальной переменной val .

 const val = 1;

class Example {
  constructor(val) {
    this.val = val;
  }
  
  print() {
    console.log(val);
  }
}

new Example(2).print(); 

Здесь все по-другому. Поскольку Example класс был создан внутри области if блока, val он ссылается на val переменную внутри этой области. Если бы не было никакой переменной с таким именем, было бы возвращено значение из переменной в глобальной области.

 const val = 1;

if (true) {
  const val = 3;
  
  class Example {
    constructor(val) {
      this.val = val;
    }

    print() {
      console.log(val);
    }
  }

  new Example(2).print();
} 

Кроме того, если бы функция, выполняющая печать val , имела переменную с именем val в своей области, это была бы переменная, значение которой было бы напечатано.

Важно помнить , что если переменная создается с использованием var , она не будет содержаться внутри областей блоков (в условиях if, switch или циклах for и while).