在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?
Posted
技术标签:
【中文标题】在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?【英文标题】:Do variables referred to without using the this keyword in a Javascript class refer to the global variables?在 Javascript 类中不使用 this 关键字引用的变量是否引用全局变量? 【发布时间】:2021-10-31 07:42:02 【问题描述】:我试图使用类在节点中制作一个菜单驱动的 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 operation\n1.Addition\n2.Subtraction\n3.Multiplication\n4.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'关键字,类/对象方法会访问同名的全局变量吗? 我是初学者,所以如果这是一个愚蠢的问题,我提前道歉。
【问题讨论】:
如果它们没有在本地定义,即在函数内部,那么是的,它们将被查找范围链直到它到达全局范围。然后在do...while
循环中使用 num1 = read.questionInt()
行设置全局变量
当使用new关键字调用函数时,该函数是构造函数并返回一个新实例。在这些情况下,“this”指的是新创建的实例。
拜托,请在严格模式下运行您的代码,然后这个accidental
分配给全局变量将被标记为编程错误(它应该是),然后这种事情不会意外发生.将报告错误,您必须修复代码才能正确。 strict
模式是你的朋友。
@peter 但是我们不能在构造函数内部或javascript类的方法外部使用'var'、'let'或'const',可以吗?但是我们可以使用那些内部类方法。有点奇怪
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 循环中)。
【讨论】:
以上是关于在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 setter 的 'this._obj['a']=2' 在 Dart 类中不起作用
JavaScript 类中的 setTimeout() 使用“this”