#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).